【问题标题】:Method calling using reference variable使用引用变量调用方法
【发布时间】:2015-05-05 20:48:21
【问题描述】:
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

问题---->为什么当控制权转到基类构造函数时,调用派生类的 setVar() 方法而不是基类的 setVar() 方法。 我预计输出为 30 ,但是当在调试模式下运行该程序时发现流程并得到输出为 40。谁能解释一下这背后的逻辑。 谢谢

【问题讨论】:

    标签: java constructor overriding chaining


    【解决方案1】:

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

    在调用基类构造函数时,多态是指调用派生类的setVar的版本,加上20。然后调用派生类构造函数,再次调用派生类版本的setVar,再次添加20,得到40。

    【讨论】:

    • 关于你的回答我有两个疑问: 1>这意味着如果在 main 方法中即使我将 Base b = new Derived() 更改为 Derived d = new Derived() 也会发生同样的事情? 2> 如何使用派生类对象调用基类setVar()方法?
    • 1.是的,只有运行时类型很重要。 2. 从代码调用类的方法,被覆盖的方法是不可访问的。从类内部代码,你可以调用super.setVar();
    • "从调用类方法的代码中,无法访问被覆盖的方法。"您能否详细说明您的这一声明?
    • main 中的代码,在BaseDerived 类之外,您不能调用被覆盖的方法。 b.setVar() 将调用派生类的方法,而不是基类的方法,如果 b 在运行时确实是 Derived,则无论 b 是否被声明为 BaseDerived
    【解决方案2】:

    工作中的多态性。

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

    所以Derived setVar() 被调用了两次,因为它在“Derived”中被覆盖,并且您尝试创建一个“Derived”类的对象。

    【讨论】:

      猜你喜欢
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2017-06-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多