这个上演的演示如何运作?

时间:2018-08-01 14:49:58

标签: java upcasting dynamic-dispatch

我已经创建了一个向上演示的演示,我不理解这段代码的工作方式,或者我可以更具体地说为什么在派生类完成派发时为什么还要调用基类的构造函数。调用基类的构造函数。我什至没有在任何地方都使用过super关键字,而基类的构造函数也是如此。

class Base{
        int value =0;
        Base(){

            addValue();
        }
        void addValue(){

            value+=10;
        }
        int getValue(){
            return value;
        }

}
class Derived extends Base{

    Derived()
    {
        addValue();
    }
    void addValue(){
        value+=20;
    }
}
class Test{
    public static void main(String args[]){
        Base b=new Derived();
        System.out.println(b.getValue());
    }
}

2 个答案:

答案 0 :(得分:1)

创建新的Derived对象时,将调用其构造函数。由于Derived具有超类Base,因此将首先调用其构造函数。在构造函数中,将调用覆盖的方法addValue,这将导致临时值20。此后,将调用addValue中的Derived,并向{{1}添加另外20个值。 }。最终结果是40。

由于您没有亲自使用value调用超类的构造函数,因此Java将自动执行此操作:

super

答案 1 :(得分:0)

派生对象是-基础对象,还有更多。与大多数语言一样,Java需要构造整个对象,包括由Base构造函数初始化的部分。

以这种方式查看:将value初始设置为0是什么?那不是Base代码的一部分吗?

如果需要,Java允许您指定要与super一起使用的基类构造函数,但是如果您不指定一个,它将选择一个。这些规则可能很复杂,但是在这种情况下,它们很简单:从无参数派生构造函数中调用无参数基本构造函数。

作为测试,将Base()构造函数设置为私有,然后查看编译器告诉您的内容。