我想知道为什么这个没有工作,如为什么没有编译器的计算机类中调用重启方法...参考变量和对象
考虑以下情形:
我有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();'在问题行。这是你期待的行为吗?如果是这样,我可以给你写一个完整的答案,解释为什么这会起作用,以及为什么你的原始代码没有达到你的预期。据我所知,你知道你可以这样做,但不知道为什么原始代码不起作用。 –