Oop 参考变量和对象

Oop 参考变量和对象,oop,object,inheritance,reference,polymorphism,Oop,Object,Inheritance,Reference,Polymorphism,我想知道为什么这不起作用,比如为什么编译器没有在计算机类中调用restart方法 考虑以下场景: 我有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 vo

我想知道为什么这不起作用,比如为什么编译器没有在计算机类中调用restart方法

考虑以下场景:

我有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方法呢?

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

restart方法已在子类中被重写…,what is my method and what is base method,您没有明确指定在使用这些术语时所指的方法…'my'和'base'。super.restart();我想我不是很清楚我想表达什么。testObj.restart()怎么会不使用super classes restart方法呢?如果编译器只检查引用变量类(super)中的方法,我会假设它会这样做。调用macintosh restart方法而不调用派生类方法restart,该方法需要使用super关键字调用。您可以通过在中实现来隐藏它。删除它,将调用派生类方法。此代码的预期输出是什么
关闭
打开
重新启动成功
?@MattMartin我本以为编译器会调用超级类重新启动方法,我知道你通常会执行super.Restart(),但我很好奇为什么没有调用计算机类重新启动方法。试试
((计算机)testObj.Restart()在问题行。这是你期待的行为吗?如果是这样的话,我可以给你写一个完整的答案,解释为什么这是可行的,为什么你的原始代码没有达到你的预期。据我所知,您知道可以这样做,但不知道为什么原始代码不能工作。