6

我知道,重載使用靜態綁定和重寫使用動態綁定。 但是,如果他們混合? 根據this tutorial,爲了解析方法調用,靜態綁定使用類型信息,而動態綁定使用實際的對象信息。大小寫:靜態綁定?動態綁定?

那麼,在下面的例子中是否發生了靜態綁定,以確定調用哪個sort()方法?

public class TestStaticAndDynamicBinding { 

    @SuppressWarnings("rawtypes") 
    public static void main(String[] args) { 
     Parent p = new Child(); 
     Collection c = new HashSet(); 

     p.sort(c); 
    } 
} 

public class Parent { 

    public void sort(Collection c) { 
     System.out.println("Parent#sort(Collection c) is invoked"); 
    } 

    public void sort(HashSet c) { 
     System.out.println("Parent#sort(HashSet c) is invoked"); 
    } 
} 

public class Child extends Parent { 

    public void sort(Collection c) { 
     System.out.println("Child#sort(Collection c) is invoked"); 
    } 

    public void sort(HashSet c) { 
     System.out.println("Child#sort(HashSet c) is invoked"); 
    } 
} 

PS: 的輸出是:在編譯時期間 Child#sort(Collection c) is invoked

+0

什麼是輸出? –

回答

4

這裏有兩個綁定階段,正如你猜測的那樣。

首先,靜態階段,即會選擇撥打sort(Collection c)。這是在編譯時完成的,並且因爲cCollection類型的參考,所以將使用此方法,而不考慮運行時類型(它是HashSet)。

然後,在運行時,因爲p實際上包含一個Child實例,所以它的方法將被調用,並且您將獲得"Child#sort(Collection c) is invoked"

4

,靜態綁定確定(VS HashSet集合)方法與簽名將被使用。在執行期間,虛擬機決定在哪個對象上調用該方法