我想知道爲什麼這個沒有工作,如爲什麼沒有編譯器的計算機類中調用重啓方法...參考變量和對象
考慮以下情形:
我有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 」。所以如果我所說的是真的,爲什麼重新啓動方法不被調用?
此代碼的預期輸出是什麼? '關閉''打開''重新啓動成功'? –
@MattMartin我會希望編譯器調用超類的重啓方法,我知道你通常會做super.restart(),但我很好奇爲什麼Computer類重啓方法沒有被調用。 – RamanSB
嘗試'((計算機)testObj).restart();'在問題行。這是你期待的行爲嗎?如果是這樣,我可以給你寫一個完整的答案,解釋爲什麼這會起作用,以及爲什麼你的原始代碼沒有達到你的預期。據我所知,你知道你可以這樣做,但不知道爲什麼原始代碼不起作用。 –