使用引用变量调用方法

Method calling using reference variable

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

派生 Class:

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

问题 ----> 为什么当控制转到 base class 构造函数时,调用 Derived class 的 setVar() 方法而不是 Base class setVar() 方法。 我预计输出为 30 ,但是当 运行 这个处于调试模式的程序找到流程并得到输出 40 时。谁能解释一下这背后的逻辑。 谢谢

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

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

工作中的多态性。

当您在派生 class 中重写超级 class 方法时,当有人对派生 class 的任何对象进行操作时,派生 class 中总是会调用您重写的方法],哪怕那个人是超级class。

所以 Derived setVar() 被调用了两次,因为它在“Derived”中被覆盖,而您试图创建一个对象“Derived” class.