簡體   English   中英

以下代碼是否將后期綁定應用於 static 方法? 多態性 Java

[英]Did this following code apply late binding onto a static method? Polymorphism Java

所以我在 Java 玩弄以了解多態性的概念,我寫了這個:

public class Practice 
{
    public static void main(String[] args) 
    {
        Parent p = new Child();
        
        p.instanceMethod();
    }
}

class Child extends Parent {
     public void instanceMethod(){
         System.out.println("child's instance method");
         staticMethod();
     }
     public static void staticMethod() {
         System.out.println("child's static method");
     }
}

class Parent {
     public void instanceMethod(){
         System.out.println("parent's instance method");
         staticMethod();
     }
     public static void staticMethod() {
         System.out.println("parent's static method");
     }
}

所以這個的output是:

child's instance method
child's static method

為什么 static 方法是從孩子的 class 調用的,而不是從它的 static 類型,父母的 class 調用的?

是不是因為它首先被孩子的 class 中的實例方法調用,所以此時它的類型已經是完全動態的,也就是孩子的類型?

static 方法不“做”多態性。 完全沒有。

非靜態(即實例)方法可以。 該方法的簽名是完全靜態綁定的; 查找在類型層次結構中實際運行的方法的實際前景完全是動態完成的(后期綁定)。

對於 static 方法,整個事情完全是 static。

那么,讓我們通過這段代碼來 go:

p.instanceMethod()

表達式p的類型為Parent 編譯器查看Parent及其所有超類型中可用的簽名,並確定此instanceMethod()調用嘗試調用的完整方法簽名是void instanceMethod() 這個調用(字節碼中的Parent :: instanceMethod()V )被編碼在 emitted.class 文件中。

在運行時,系統檢查p表達式解析的實際運行時類型(這是您之前執行的new Child() ),並進行動態調度。 Childpublic void instanceMethod()顯然覆蓋了Parent中的 public void instanceMethod() ,它被選擇並執行,因此打印"child's instance method"

staticMethod()在孩子

接下來,讓我們看一下 staticMethod 調用:在編譯時,javac 確定這顯然是對ChildstaticMethod()的引用。 它在字節碼INVOKESTATIC字節碼編碼為Child :: staticMethod()V 動態調度現在或從未應用於 static 方法調用。

在運行時.. 調用該方法。

就那么簡單。

也許您希望 static 方法仍然首先檢查調用上下文,但 java 不是這樣工作的。

暫無
暫無

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

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