【发布时间】:2015-10-01 04:27:09
【问题描述】:
我想知道为什么这不起作用,例如为什么编译器没有调用计算机类中的重启方法...
考虑以下场景:
我有 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
}
}
我知道编译器会检查重启方法是否在引用变量“Computer”的类中,而不是在引用“macintosh”另一端的实际对象的类中。那么如果我说的是真的,为什么没有调用restart方法呢?
【问题讨论】:
-
这段代码的预期输出是什么?
Turning offTurning onRestart successful? -
@MattMartin 我原以为编译器会调用超类重启方法,我知道你通常会执行 super.restart(),但我很好奇为什么计算机类重启方法是'没有被调用。
-
在问题行尝试
((Computer)testObj).restart();。这是您期望的行为吗?如果是这样,我可以给你写一个完整的答案,解释为什么它有效以及为什么你的原始代码没有达到你的预期。据我了解,您知道您可以这样做,但只是不确定为什么原始代码不起作用。
标签: oop object inheritance reference polymorphism