Важно: я предполагаю, что класс BTW
расширяется Car
, а не Audi
(что не имеет смысла ИМО).
Но с тем же объектом я не могуДля вызова первого (int x, int y) класса Audi.
Необходимо различать тип переменной и тип значения (объект).В случае
Car car = new Audi();
тип переменной равен Car
, а тип объекта, который она содержит, - Audi
.
Вы должны понимать, что компилятор не принимает значение переменной.Он применяет те же правила, как если бы он был параметром метода, например
void someMethod(Car car){
//do something with `car`
}
, где внутри этого метода мы не знаем, будет ли он использоваться с someMethod(new Audi());
или someMethod(new BMW());
.
* 1030.* Так какие методы могут быть
безопасно вызваны через
car
переменную внутри
someMethod
тела?Только те, которые
гарантируют , будут реализованы (появиться) в
всех объектах, которые могут быть использованы в качестве аргументов метода.Если этот метод позволит нам написать
car.first(1, 2);
, он будет работать для сценария, подобного
someMethod(new Audi())
, но потерпит неудачу для
someMethod(new BMW())
, потому что у BMW нет метода
first(int x, int y)
.