使用引用变量调用的方法

时间:2015-05-05 20:48:21

标签: java constructor override chaining

public class Base {

    int var =0;
    Base(){
        System.out.println("Inside Base constructor .....");
        setVar();
    }

    public void setVar(){
        System.out.println("Inside base setVar method.....");
        var+=10;
    }

    public int getVar(){
        return var;
    }
}

派生类:

public class Derived extends Base {

    Derived(){
        System.out.println("Inside Derived constructor .....");
        setVar();
    }

    public void setVar(){
        System.out.println("Inside Derived setVar method.....");

        var+=20;
    }

    public static void main(String[] args){

        Base b = new Derived();
        System.out.println(b.getVar());
    }
}

输出.....

Inside Base constructor .....                                                      
Inside Derived setVar method.....                                                   
Inside Derived constructor .....                                                    
Inside Derived setVar method.....                                                   
40

问题---->为什么当控制转到基类构造函数时,调用Derived类的setVar()方法而不是Base类的setVar()方法。 我期望输出为30,但是当在调试模式下运行该程序时发现了流程并且输出为40.有人可以解释这背后的逻辑。 感谢

2 个答案:

答案 0 :(得分:0)

Java将根据变量的运行时类型决定运行哪个方法,即使用多态,即使调用的方法来自基类构造函数。

调用基类构造函数时,多态意味着调用派生类的setVar版本,并添加20。然后调用派生类构造函数,再次调用派生类的setVar版本,再添加20,产生40。

答案 1 :(得分:0)

工作中的多态性。

当您在派生类中覆盖超类方法时,当有人对派生类的任何对象进行操作时,总是会调用派生类中的重写方法,即使某人是超类。

所以Derived setVar()被调用两次,因为它在' Derived'中被覆盖了并且您尝试创建' Derived'类。