我有以下代码,我不明白为什么这段代码的输出是:“高高”。在我看来,输出必须是:“Low Out”
public class A{
private String runNow(){
return "High";
}
static class B extends A{
public String runNow(){
return "Low";
}
}
public static void main(String args[]){
A[] a=new B[]{new B(),new C()};
for(A aa:a)
System.out.print(aa.runNow()+" ");
}
}
class C extends A.B{
public String runNow(){
return "Out";
}
}
答案 0 :(得分:4)
由于班级runNow()
中的A
方法为private
,因此根本不会覆盖它。因此,输出符合预期。
尝试在类@Override
中的方法上添加B
注释,您将看到编译器错误。
答案 1 :(得分:3)
private
方法无法覆盖。规则在Java Language Specification 8.4.8.1. Overriding (by Instance Methods)
在类C中声明的实例方法m1会覆盖另一个实例 方法m2,在A类中声明如果满足以下所有条件:
C是A的子类。
m1的签名是m2签名的子签名(§8.4.2)。
或者:
- m2 公开,受保护或声明为默认访问权限 打包为C,或
- m1覆盖方法m3(m3与m1不同,m3与m2不同), 这样m3就会覆盖m2。
当您在runNow()
和B
中声明C
方法时,您只是在创建一种新方法。尝试将@Override
添加到其中以进行踢腿。您将收到编译器错误
A.B类型的runNow()方法必须覆盖或实现超类型 方法
在你的for循环中
for(A aa:a)
System.out.print(aa.runNow()+" ");
您正在对声明为runNow()
类型的变量调用A
,因为您在A
类中,您可以访问它们。 这里没有涉及多态性。