簡體   English   中英

Java中的靜態綁定和動態綁定

[英]Static binding and dynamic binding in Java

一開始我是初學者
我看了太多的教程,閱讀了很多示例,甚至從JLS試圖理解這個主題,但是我仍然有些困惑或誤解。

讓我告訴你我無法理解的問題。

試想一下,我們有三個班ParentChild1Child2如下:

class Parent {
    void doSmth(Object o) {
        System.out.println("Parent.doSmth");
    }
}

class Child1 extends Parent {
    void doSmth(Object o) {
        System.out.println("Child1.doSmth");
    }
}

class Child2 extends Parent {
    void doSmth(String s) {
        System.out.println("Child2.doSmth");
    }
}

class Test {
    public static void main(String[] args) {
        Parent p1 = new Child1();
        Parent p2 = new Child2();

        p1.doSmth("String");
        p2.doSmth("String");
    }
}

我了解的是,因為p1p2的引用來自Parent類型,所以doSmth(Object)僅對編譯器可見。

p1.doSmth("String"); 編譯器沒有綁定它,因為有一個覆蓋方法,因此它只供JVM在運行時綁定它(動態綁定)。

而對於p2.doSmth("String"); 編譯器對其進行了綁定,因為它沒有找到覆蓋其的方法(靜態綁定)。

問題是,我說的是真的嗎? 還是我有一個誤解? 如果是錯誤的,那么請告訴我在這種情況下編譯器應采取哪些步驟?
如果是真的,那么編譯器如何期望p1.doSmth具有覆蓋方法(雖然它不知道它是實類型),而在p2.doSmthp2.doSmth其綁定呢? 我錯過了什么嗎?

對不起,但這確實讓我頭疼。

試圖總結討論。 根據需要進行編輯。

Java中的靜態綁定在編譯時發生,而動態綁定在運行時發生。

在編譯時,p1和p2都是Parent的類型,並且Parent具有doSmth(Object)方法,因此兩條線都綁定到同一方法。

    p1.doSmth("String");
    p2.doSmth("String");

在運行時,動態綁定成為現實。

p1是Child1的實例,而Child1已覆蓋doSmth(Object),因此使用了Child1的實現。

p2是Child2的實例,Child2不會覆蓋doSmth(Object),因此將調用從Parent繼承的方法的實現。

暫無
暫無

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

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