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

时间:2017-09-12 09:08:44

标签: java override

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

    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()方法?

3 个答案:

答案 0 :(得分:2)

  

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

您永远不会在您发布的代码中创建子类<li class="product-category product first"> <a href="#"> <img src="http://placehold.it/370x370" alt="Drinks" class="imgbox" width="370" height="370" /> <h2 class="woocommerce-loop-category__title">Drinks</h2> </a> </li>的实例,只有父类的实例(NumbersTestChild返回父类的实例 - getApplication()) 。因此执行父方法。

答案 1 :(得分:1)

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

这样的事情可以起作用:

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

答案 2 :(得分:0)

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

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);
}