这个升级演示是如何工作的?

how is this upcasting demo working?

我已经创建了一个向上转换演示,但我不明白这段代码是如何工作的,或者我可以更具体地说为什么在使用 Derived class.And 甚至没有调用基础 class.I 的构造函数,甚至没有在任何地方使用 super 关键字比基础 class 的构造函数如何调用。

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

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

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

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

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

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

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

Derived() {
    super();
    addValue();
}