В приведенном ниже коде подкласс расширяет свой суперкласс и переопределяет его метод, используя его для вызова другого метода, уникального для подкласса, который использует переменную подкласса.
Затем программа сохраняет экземпляр подкласса переменной переменной Superclass и затем вызывает ее метод. Затем он работает так, как будто он имеет тип Subclass, вызывая метод и переменную, уникальные для подкласса. Однако получить доступ к ним напрямую невозможно.
class Superclass {
void go() {
System.out.println(0);
}
}
class Subclass extends Superclass {
int i = 1;
@Override
void go() {
run();
}
void run() {
System.out.println(i);
}
}
public class JavaApplication {
public static void main(String[] args) {
Superclass instance = new Subclass();
instance.go(); // outputs 1; it must have called run() and accessed i
instance.run(); // causes compile-time error
System.out.println(instance.i);// causes compile-time error
}
}
Когда экземпляр Subclass сохраняется как тип Superclass, он все равно имеет доступ ко всем полям и методам подкласса. Так почему я не могу получить к ним доступ напрямую?
В случае переменных и статических методов вызывается метод в соответствии с типом ссылки, а не в соответствии с переданным объектом.
Но в случае методов экземпляра метод вызывается в соответствии с типом передаваемого объекта, а не в соответствии с типом ссылки