簡體   English   中英

java中的重載和覆蓋可以是靜態多態還是動態多態?

[英]Can overloading and overriding in java be static polymorphism as well as dynamic polymorphism?

那么這類問題已經得到了回答,但這讓我很困惑。 我花了很多時間經歷了很多回答,所以請在復制之前先回答我的問題。

情況1 -

靜態多態 - 函數重載動態多態 - 函數覆蓋

鏈接 - https://stackoverflow.com/a/12894211/3181738 https://stackoverflow.com/a/20783390/3181738和許多其他人。

我的困惑在於,在所有示例中,使用upcasting顯示動態多態性。 如果我不向上怎么辦?

class A{
   public void show(){
       System.out.print("A");
   }
}

class B extends A{
   public void show(){
        System.out.print("B");
   }

   public static void main(String[] s){
      A a = new B();
      a.show(); // upcasting. It is dynamic polymorphism.
      B b = new B();
      b.show(); // Now java compiler can decide so is it still dynamic polymorphism?
   }
}

案例2 -

如果方法是private,static或final,則通過重載實現靜態多態。

那么重載公共和默認方法呢?

靜態方法只能重載。

非靜態方法可以被重寫和重載。

public/protected/private不直接影響這個,除了因為從子類中看不到private方法,所以它們也不能被覆蓋。 這里定義確切的規則

如果要阻止覆蓋非靜態方法,可以將其聲明為final private方法因此是隱含final 。)

Q1 upcasting:向上轉換和處理子類對象就像它是父類對象一樣,是多態的本質。 所以你的問題是,“如果我不上傳怎么辦?” 那你就不是在使用多態

Q2靜態多態 - 方法重寫:這就是它所說的:

  • static:靜態方法是可覆蓋的,因為它們與類相關聯,而不是與對象相關聯。 因此,例如,如果您有一個帶有main方法的類,然后將其子類化,並將main方法添加到子類,則在子類中執行main方法時,它將被靜態覆蓋

    • private:私有方法不是繼承的,不能在子類中調用,除非靜態重寫

    • final:最終方法不可覆蓋。 因此,在子類中重新定義它們會創建一個靜態重寫的方法

情況1
在編譯時,編譯器將識別匹配的方法簽名ie。 它將是show() ,在您的示例中沒有參數。 無論是AB的方法被調用仍然是運行時,即使在您的示例中您確定它是B

案例2
我認為方法的可見性規則可能會給你帶來一些困惑。

將在編譯時決定將在運行時調用哪個重載方法,即。 重載方法是靜態決定的 - 無論是public,package-private(默認)還是私有。 如果發生方法調用的對象沒有在編譯時失敗的方法的可見性。

正如其他人所說 - 覆蓋不適用於靜態方法,因為它是類的一部分而不是實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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