我正在准备 Java 考试,有一个关于静态和动态类型的问题。
我有 4 个类:A、B、C 和 Main。
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();
}
}
你可以看到前两行就可以了(按照你当前的思维逻辑)。 B
具有方法 tell()
,因此 b
应该能够调用 tell()
。但是,对没有 tell()
方法的 C
的另一个子类使用完全相同的赋值,那么您的逻辑将会失败。 A
和 C
都没有 tell()
方法,因此程序突然调用了不存在或不可访问的方法。
关于java - 关于相互扩展的类中的重写方法的问题。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460368/