[英]Static binding and dynamic binding in Java
一開始我是初學者
我看了太多的教程,閱讀了很多示例,甚至從JLS試圖理解這個主題,但是我仍然有些困惑或誤解。
讓我告訴你我無法理解的問題。
試想一下,我們有三個班Parent
, Child1
, Child2
如下:
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");
}
}
我了解的是,因為p1
和p2
的引用來自Parent
類型,所以doSmth(Object)
僅對編譯器可見。
為p1.doSmth("String");
編譯器沒有綁定它,因為有一個覆蓋方法,因此它只供JVM在運行時綁定它(動態綁定)。
而對於p2.doSmth("String");
編譯器對其進行了綁定,因為它沒有找到覆蓋其的方法(靜態綁定)。
問題是,我說的是真的嗎? 還是我有一個誤解? 如果是錯誤的,那么請告訴我在這種情況下編譯器應采取哪些步驟?
如果是真的,那么編譯器如何期望p1.doSmth
具有覆蓋方法(雖然它不知道它是實類型),而在p2.doSmth
中p2.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.