0

我创建了一个向上转换的演示,我不明白这段代码是如何工作的,或者我可以更具体地说明为什么在派生类完成调度时还要调用基类的构造函数。甚至没有调用基类的构造函数。我什至没有在任何地方使用超级关键字,而不是如何调用基类的构造函数。

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

2 回答 2

1

当你创建一个新Derived对象时,它的构造函数将被调用。由于Derived有一个超类Base,它的构造函数将首先被调用。在构造函数中,addValue将调用被覆盖的方法,这导致临时值 20。之后,调用addValueofDerived并将另一个 20 添加到value. 最终结果为 40。

由于您没有使用super自己调用超类的构造函数,Java 会自动执行此操作:

Derived() {
    super();
    addValue();
}
于 2018-08-01T14:58:47.420 回答
0

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

看看是这样的:值初始设置为0是干什么的?这不是 Base 代码的一部分吗?

如果您愿意, Java 允许您指定使用哪个基类构造函数super,但如果您不指定一个,它会选择一个。这些规则可能很复杂,但在这种情况下它们很简单:无参数 Base 构造函数是从无参数 Derived 构造函数中调用的。

作为测试,将 Base() 构造函数设置为私有,看看编译器告诉你什么。

于 2018-08-01T14:54:39.773 回答