在下面的代码中,子类扩展其超类,并覆盖其方法,使用它来调用另一个子类唯一的方法,该方法使用子类的变量。
然后,程序将子类的实例存储到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,它仍然可以访问所有Subclass字段和方法。那为什么我不能直接访问它们呢?
答案 0 :(得分:0)
在变量和静态方法的情况下,根据引用的类型调用方法,而不是根据被引用的对象。
但是在实例方法的情况下,根据被引用的对象的类型调用该方法,而不是根据引用的类型