簡體   English   中英

在擴展類中使用多態

[英]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。

BC聲明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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM