2016-05-22 186 views
-1

嗨,我不知道編譯器如何確定執行哪個方法。我知道有編譯時間和執行時間。我們有重載方法。靜態綁定與動態綁定

public class A{ 
    void print(A x){ 
     System.out.println("This is message A"); 
    } 
} 

public class B extends A{ 
    void print (B x){ 
     System.out.println("This is message B"); 
    } 
} 

A a = new A(); 
B b = new B(); 
A ab = new B(); 
b.print(a); 
b.print(ab); 

在這兩個調用的結果是:

這是消息中的

+2

什麼是'b.f'?有沒有這樣的方法... –

+0

我認爲方法f是什麼,但打印?如果是這樣的話,你傳遞了a和ab兩個都聲明爲A類型。所以它總是會調用void print(A x),因爲它接受類型A的對象 –

+0

不要將重載與重寫混淆。這是兩個不同的面向對象的概念。如果它與超類中的簽名具有相同的簽名,則將覆蓋子類中的方法。 –

回答

-2

沒有動態的Java綁定。所有方法調用是在編譯時解析(除非使用反射,這是不是這裏的情況)

然而,B類的print()方法不覆蓋從A類中的一個,因爲參數不具有相同的類型。另外,對編譯器來說重要的是變量的正式聲明,而不是它的賦值。因此,ab變量被稱爲A類型的對象。所以編譯器會調用A類的print()類,因爲它沒有被覆蓋B

+0

Java支持動態(運行時)綁定。多態是動態綁定。您不能在沒有動態綁定的情況下在抽象基類中創建抽象方法。 – nicomp

+0

我糾正 –

1

這既不是重載也不是重寫。其次,你不能指向具有子引用的父對象

+0

是的,它是超載。方法打印。相同的名稱不同的參數 – bb88

+0

用於重載,方法應該在具有相同方法名稱且具有不同參數類型和編號的同一類中。 –