繁体   English   中英

应用于超类的子类中的java方法重写

[英]java method override in subclass applied to superclass

说我正在写一个程序,并在父类中有一个方法:

    public class NumbersTest {

    /**
     * @param args the command line arguments
     */

    private int number = 1;

    private static NumbersTest mNumbersTest = null;

    public NumbersTest() {
    }



    public static NumbersTest getApplication(){
       if(mNumbersTest == null)
           return new NumbersTest();
       return mNumbersTest;
    }

    public  int getNumber(){
        return number;
    }

    public static void main(String[] args) {
        int print = getApplication().calcNumber();
        System.out.println(print);
    }

    public int calcNumber(){
        int num = getNumber();

        return num + num;       
    }

}

和一个儿童班:

public class NumbersTestChild extends NumbersTest{

    @Override
    public int getNumber(){
        return 2;
    }

    public static void main(String[] args) {
        int print = getApplication().calcNumber();
        System.out.println(print);
    }

}

当我运行父类时,我希望main()函数打印2.但是当我运行子类时,我希望main()函数打印4,因为我已经重写了getNumber()方法以返回值2.但是,结果与父类'main():2相同。

为什么不使用子类中的getNumber()的重载版本而不是父类中的常规getNumber()方法?

为什么不使用子类中的getNumber()的重载版本而不是父类中的常规getNumber()方法?

您永远不会在您发布的代码中创建子类NumbersTestChild的实例,只有父类的实例( getApplication()返回父类的实例 - NumbersTest )。 因此执行父方法。

这行int print = getApplication().calcNumber()没有创建子类的实例。 这意味着getNumber()基本上仍然属于NumbersTest

这样的东西可以工作:

NumbersTestChild child = new NumbersTestChild();
int print = child.calcNumber();
.....

如果要获得所需的输出,请在NumbersTestChild更改main()方法代码,如下所示。

public static void main(String[] args) {
    NumbersTest ns = new NumbersTestChild(); // Child has been created
    /* calcNumber returns 4 ( 2+2) since getNumber() returns 2 from child class */
    int print = ns.calcNumber(); 
    System.out.println(print);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM