【问题标题】:reference variables and objects引用变量和对象
【发布时间】: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


【解决方案1】:

您必须调用基类方法才能真正重新启动。您的方法只是隐藏基本方法。你应该重写该方法,然后调用它 base.restart 来做你想做的事。

【讨论】:

  • restart方法已经在子类中被覆盖了...,我的方法是什么,基础方法是什么,你在使用这些术语时没有明确指定你指的是哪个方法...“我的”和“基地”。
  • super.restart();不是很清楚我想表达什么。
  • testObj.restart() 怎么会不使用超类重启方法,如果编译器只检查引用变量类中的方法(超级)。
  • 您的调用 macintosh 重启方法而不调用您的派生类方法 restart 需要使用 super 关键字调用。
  • 你通过实现隐藏它。删除它,派生类方法将被调用。
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2018-04-15
  • 2019-11-20
  • 2016-01-08
  • 2013-10-11
  • 1970-01-01
相关资源
最近更新 更多