2015-07-13 157 views
0

我想知道爲什麼這個沒有工作,如爲什麼沒有編譯器的計算機類中調用重啓方法...參考變量和對象

考慮以下情形:

我有3類,如下所示:

public class Computer { 
public int compStatus = 0; //0 means off, 1 means on. 

public void turnOn(){ 
    this.compStatus = 1; 
} 

public void turnOff(){ 
    this.compStatus = 0; 
} 

public void restart(){ 
    if(compStatus ==1){ 
    System.out.println("Turning off"); 
    compStatus = 0; 
    System.out.println("Turning on"); 
    compStatus = 1; 
    System.out.println("Restart successful"); 
    } 
} 


} 

現在子類:

public class Macintosh extends Computer { 

public void openXCode(){ 
    if(compStatus == 1){ 
     System.out.println("XCode Compiler opened."); 
    } 
    else{ 
     System.out.println("Mac is off."); 
    } 
} 

public void restart(){ 
    System.out.println("Mac restarted"); 
} 

} 

的測試類:

public class CompTest { 
public static void main(String[] args){ 

    Computer testObj = new Macintosh(); 
    testObj.turnOn(); 
    testObj.restart(); ///ERROR HERE 
} 
} 

我知道,編譯器會檢查重啓方法是在類的引用變量「計算機」不是類的實際對象的引用的另一端「的Macintosh 」。所以如果我所說的是真的,爲什麼重新啓動方法不被調用?

+0

此代碼的預期輸出是什麼? '關閉''打開''重新啓動成功'? –

+0

@MattMartin我會希望編譯器調用超類的重啓方法,我知道你通常會做super.restart(),但我很好奇爲什麼Computer類重啓方法沒有被調用。 – RamanSB

+1

嘗試'((計算機)testObj).restart();'在問題行。這是你期待的行爲嗎?如果是這樣,我可以給你寫一個完整的答案,解釋爲什麼這會起作用,以及爲什麼你的原始代碼沒有達到你的預期。據我所知,你知道你可以這樣做,但不知道爲什麼原始代碼不起作用。 –

回答

0

您必須調用基類方法才能真正重新啓動。你的方法只是隱藏了基本方法。您應該重寫該方法,然後將其稱爲base.restart以執行您想要的操作。

+0

重新啓動方法已在子類中覆蓋..., 什麼是我的方法和什麼是基本方法,您沒有明確指定使用這些術語時指的是哪種方法...'我的'和'基地'。 – RamanSB

+1

super.restart();我非常清楚我想表達的是什麼。 –

+0

如何使用testObj.restart(),如果編譯器只檢查引用變量類(super)中的方法,就不會使用超類重啓方法,我會假定它會這樣做。 – RamanSB