2013-05-11 40 views
0
public class Superclass{ 

    void method1(){ 
     method0(); 
    } 

    void method0(){ 
     System.out.println("superclass"); 
    } 

} 



public class Subclass extends Superclass{ 

    void method0(){ 
     System.out.println("subclass"); 
    } 

} 


public class Runclass{ 

    public static void main(String[] args){ 
     new Subclass().method1(); 
    } 

} 

這段代碼打印出來 - 子類。什麼決定了覆蓋方法的調用

讓我們說,這是

new Superclass().method1(); 

然後,它會打印出 - 超

叫取決於調用的方法實例的方法是什麼?

+1

'method1()'在您的代碼中根本不是重寫的方法! – NINCOMPOOP 2013-05-11 09:27:34

+0

@NoobUnChained Spotted !!! :) – 2013-05-11 09:31:04

回答

1

這取決於調用哪個對象方法。如果在父對象上調用該方法,父項方法將被調用,但如果在子對象上調用該方法,則將調用子類方法。如果方法沒有被覆蓋,那麼總是會調用父類的方法。

0

多態性。

可能是你忘了這

public class Subclass extends ParentClass{ 

直到除非你ovveride只parent method調用子類中的方法。

new Superclass().method1(); 

這裏我超類的實例有如此超類method1電話

如果你打電話

new Subclass().method1(); 

subclasses ovveridden method1電話。

我想建議這個tutorial清晰的圖片。

0

類必須擴展超級類別:

public class Subclass extends SuperClass{ 

    void method0(){ 
     System.out.println("subclass"); 
    } 

} 

當調用SubClass().method()呼叫將是子類的方法的優先級,輸出

子類

但在這種情況下:

public class Subclass extends SuperClass{ 

    } 

輸出將是:

1

試圖解釋它在一個更好的方式,當一個函數,說你method()subclass覆蓋和你在呼喚method()superclass的實例,superclass對象不知道method()被覆蓋,它將運行它自己的版本method()。實際上,對subclass所做的任何更改對superclass都是不可見的。因此superclass的任何實例都將無法訪問subclass的重寫method()

2

它是Dynamic Method Dispatch(運行時多態性)的一個示例。
在動態方法中,重載方法的調度調用在運行時解析。
當U調用

new Superclass().method1(); 

輸出 - superclass
因爲超類沒有關於子類的任何信息。
&當調用

new Subclass().method1(); 

的輸出爲 - subclass
由於被調用時被覆蓋的方法,JAVA確定方法的哪個版本被基於所述對象的類型執行AT呼叫時被引用發生。