2014-11-15 97 views
1

在下面的代碼:爲什麼調用基類方法?

b.show("str"); 
//prints: from base 
d.show(""); 
//prints: from str 

難道一個請解釋爲什麼它的表現有所不同? 我想知道爲什麼Base b = new Sub(),基類中的b.show()會被調用。 我只是使用DifferentClass,作爲參考顯示b.show(String)在非繼承機會下調用。

public class TestClass { 

    public static void main(String[] args) { 
     Base b = new Sub(); 
     b.show("str"); 
     DifferentClass d = new DifferentClass(); 
     d.show(""); 
    } 
} 

class Base { 
    public void show(Object obj) { 
     System.out.println("from base"); 
    } 
} 

class Sub extends Base { 
    public void show(String str) { 
     System.out.println("from sub"); 
    } 
} 

class DifferentClass { 
    public void show(String str) { 
     System.out.println("from str"); 
    } 

    public void show(Object obj) { 
     System.out.println("from obj"); 
    } 
} 

回答

3

由於引用類型。

Base b = new Sub(); 
    b.show("str"); 
    Sub2 s2 = new Sub2(); 
    s2.show(""); 

在該代碼中,雖然是bSub一個實例,該變量的引用類型是Base。方法重載是在編譯時評估的,而不是運行時評估的。這很重要,因爲在編譯時,一旦new Sub()構造函數運行並且我們分配變量,編譯器就不再知道具體的類。只有這是一個有效的Base

這是爲什麼?

因爲當編譯器試圖解決b.show(String),對Base沒有方法(它知道的唯一一種肯定爲b),接受一個String,所以它傳遞的字符串到show(Object)方法。

Sub不覆蓋show(String)方法(儘管Sub2確實)。

順便說一句,在@Override註釋將幫助您與此:When do you use Java's @Override annotation and why?

+0

+1。究竟。關鍵是該子方法不會「覆蓋」基類方法,但會超載它。我同意儘可能經常使用@Override。 –

0

您正在調用一個字符串,以便調用show()方法重載字符串。

也許你沒有意識到sub2不會繼承??

0

你聲明的變量b的類型爲基礎的,那麼你調用顯示()就可以了。由於它有一個匹配簽名的show方法,也就是調用的方法。

然後你聲明你的變量s2是Sub2類型,並在其上調用show(String)。運行時由於匹配而調用該方法。

相關問題