Я хотел бы понять, почему это происходит именно так и какая польза от преимущества следующего явления: я использую суперкласс для инициализации объекта подкласса, почему объект будет иметь атрибуты подкласса и методы суперкласса?
Посмотрите код, чтобы понять, что я на самом деле имею в виду:
class SuperClass {
public String s = "'This is the superclass'";
public String method() {
return s;
}
}
class SubClass extends SuperClass {
public String s = "'This is the subclass'";
public String method() {
return s;
}
}
public class SubClassTest {
public static void main(String[] args) {
SuperClass sc = new SuperClass();
System.out.println("Superclass s: " + sc.s + " bzw. method: " + sc.method());
SubClass subc = new SubClass();
System.out.println("SubClass s: " + subc.s + " bzw. method: " + subc.method());
SuperClass x = subc;
System.out.println("x s: " + x.s + " bzw. method: " + x.method());
}
}
Вывод следующий:
Superclass s: 'This is the superclass' bzw. method: 'This is the superclass'
SubClass s: 'This is the subclass' bzw. method: 'This is the subclass'
x s: 'This is the superclass' bzw. method: 'This is the subclass'
SuperClass x = new SubClass();
создает ссылочную переменную типаSuperClass
, и эта переменная указывает на объектSubClass
. Эта ссылочная переменная может видеть какinherited and overridden methods
, так иSubClass
. Он не сможет получить доступ ни к какому другому методу вSubClass
. Иvariables
не наследуются, и поэтому он печатаетSubClass String
. - person Mathews Mathai   schedule 21.03.2018