У меня есть вопрос о наследовании и приведении в 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 расширяет Automobile, мы можем сказать, что p также является автомобилем. И поэтому, когда мы явно приводим его к Automobile, он продолжает использовать свои методы - в
В нашем случае метод toString()
определен в Porsche.
С другой стороны, если то, что я пишу, правильно, то второе выражение print должно давать 2, а не 1.
Теперь это кажется мне противоречием, но, поскольку это работает в Java, кажется, что я не понимаю, что происходит во время приведения и процесса наследования.