[英]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()
),並進行動態調度。 Child
的public void instanceMethod()
顯然覆蓋了Parent
中的 public void instanceMethod() ,它被選擇並執行,因此打印"child's instance method"
。
staticMethod()
在孩子接下來,讓我們看一下 staticMethod 調用:在編譯時,javac 確定這顯然是對Child
中staticMethod()
的引用。 它在字節碼INVOKESTATIC
字節碼編碼為Child
:: staticMethod()V
。 動態調度現在或從未應用於 static 方法調用。
在運行時.. 調用該方法。
就那么簡單。
也許您希望 static 方法仍然首先檢查調用上下文,但 java 不是這樣工作的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.