[英]Using Polymorphism in extends Class
我下面有一個下面的代碼,我不明白為什么這段代碼的輸出是:“ high high”。 在我看來,輸出必須是:“低輸出”
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";
}
}
由於類A
runNow()
方法是private
,因此根本不會被覆蓋。 因此,輸出是預期的。
嘗試在類B
的方法上添加@Override
注解,您將看到編譯器錯誤。
private
方法不能被覆蓋。 Java語言規范8.4.8.1中描述了這些規則。 覆蓋(按實例方法)
如果滿足以下所有條件,則在類C中聲明的實例方法m1覆蓋在類A中聲明的另一個實例方法m2:
C是A的子類。
m1的簽名是m2的簽名的子簽名(第8.4.2節)。
要么:
- m2是公共的,受保護的或具有默認訪問權限的聲明,並且與C處於同一包中,或者
- m1覆蓋方法m3(不同於m1的m3,不同於m2的m3),因此m3覆蓋m2。
在B
和C
聲明runNow()
方法時,您只是在創建一個新方法。 嘗試將@Override
添加到他們的踢球。 您將收到編譯器錯誤
AB類型的方法runNow()必須重寫或實現超類型方法
在您的for循環中
for(A aa:a)
System.out.print(aa.runNow()+" ");
您正在對聲明為A
類型A
變量調用runNow()
,並且由於您位於A
類中,因此可以訪問它們。 這里沒有多態性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.