有关相互扩展的类中覆盖方法的问题



我正在学习Java考试,有一个关于静态和动态类型的问题。

我有4个班级:A,B,C和主要。

public class A {
private void tell(){
System.out.println("AA");
}
}
public class B extends A {
public void tell(){
System.out.println("BB");
}
}
public class C extends B {
}
public class Main{
public static void main(String[] args) {
A c = new C();       
c.tell();
}
}

我的建议是:输出应该是"BB",因为c具有动态类型C。由于 C 没有方法"tell",因此使用了上层类 B 的方法,它打印"BB"。

然而,结果是一个错误,因为Java在A中寻找"tell"。在 A 中,它当然找不到它,因为在那里它被声明为 priavte。但是为什么它在A中看起来,虽然只有它的静态类型是A,但它的动态类型是C?

你得到一个错误,因为在编译时,编译器不知道将放入 A 中的实际实例,所以当编译器看到c.tell()时,他只查看类A,它确实没有可用的tell()方法。

理解这一点的一种方法是使用以下示例:

public class A {
private void tell(){
System.out.println("AA");
}
}
public class B extends A {
public void tell(){
System.out.println("BB");
}
}
public class C extends A {
}
public class Main{
public static void main(String[] args) {
A b = new B();      
b.tell();
A c = new C();       
c.tell();
}
}

你可以看到前 2 行是可以的(按照你目前的思维逻辑(。B有方法tell()所以b应该能够调用tell()。但是,将完全相同的赋值与另一个没有tell()方法的C子类一起使用,那么您的逻辑将失败。A也没有Ctell()方法,因此程序突然调用了不存在或无法访问的方法。

最新更新