У меня вопрос о наследовании и приведении типов в Java. У меня есть следующие два примера классов и тестовый класс, и я задаю свой вопрос после классов:
public class Automobile {
public int var;
public Automobile () {
var = 1;
}
public String toString () {
return "AUTOMOBILE: " + var;
}
}
public class Porsche extends Automobile {
public int var;
public Porsche () {
var = 2;
}
public String toString () {
return "PORSCHE: " + var;
}
}
public class Test {
public static void main (String [] args) {
Porsche p = new Porsche();
Automobile a = new Automobile();
System.out.println ("(Automobile) p = " + (Automobile)p);
System.out.println ("(Automobile) p.var = " + ((Automobile)p).var);
}
}
Результат:
(Automobile) p = PORSCHE: 2
(Automobile) p.var = 1
Я не понимаю, почему во втором утверждении у нас есть 1. Разве это не должно быть 2? Потому что после того, как я привел p к Automobile в первом выражении, я все еще получаю PORSCHE: 2
как представление p
- я понимаю это следующим образом:
тем не менее, я преобразовал p
в автомобиль, p
сохраняет свою "первоначальную природу" - p
является объектом класса Porsche, но поскольку Porsche расширяет автомобиль, мы могли бы сказать, что p также является автомобилем. И поэтому, когда мы явно приводим его к Automobile, он продолжает использовать свои методы — в нашем случае метод toString()
, определенный в Porsche.
С другой стороны, если то, что я пишу, верно, то второй оператор печати должен давать 2, а не 1.
Теперь это кажется мне противоречием, но поскольку это работает на Java, кажется, что я не понимаю, что происходит во время приведения и процесса наследования.