使用这段代码:
public abstract class A {
private String runNow() {
return "High";
}
public abstract String cos();
static class B extends A {
public String runNow() {
return "Low";
}
public String cos() {
return "cos from B";
}
}
public static void main(String args[]) {
A[] a = new B[] {new B(), new C()};
for (A aa : a) {
System.out.println(aa.runNow() + " " + aa.cos());
}
}
}
class C extends A.B {
public String runNow() {
return "Out";
}
public String cos() {
return "cos from C";
}
}
为什么 A
类的 runNow
方法被调用,而不是子类?
最佳答案
简短的回答是“因为 runNow()
是 private
”。
当您编译此调用 aa.runNow()
时,编译器会发现 class A
具有私有(private)的 runNow
方法,并且您的代码正在调用这个私有(private)方法。由于无法覆盖私有(private)方法,因此编译器将调用路由到 A
的 runNow()
方法 - 它知道存在于此上下文中的唯一方法。
B
和C
也以相同的名称引入它们的方法这一事实对编译器来说无关紧要,因为这些方法是子类中的新方法。编译器无法在不破坏 class A
的封装的情况下考虑它们的覆盖,这将 runNow
指定为私有(private)方法。
关于java - 为什么在超上下文中调用私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31368479/