在java中获得了意外的输出

sha*_*eeq 0 java constructor class subclass

我有一些java代码:

class Protected{
    int n = 1;

    public Protected(){
        System.out.println("Constructor of protected");
        System.out.println("========================");
        System.out.println("n = "+n);
        System.out.println();
    }
}
class Derived extends Protected{
    Derived(){
        System.out.println("Constructor of derived");
        System.out.println("======================");
        System.out.println("n = "+(n+1));
    }
}

public class Demo{
    public static void main(String args[]){
        Derived ob2 = new Derived();
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出为:

constructor of protected
========================
n=1

constructor of Derived
========================
n=2
Run Code Online (Sandbox Code Playgroud)

这就是我要的:

constructor of Derived
========================
n=2
Run Code Online (Sandbox Code Playgroud)

rge*_*man 7

必须为子类的每个新实例调用超类构造函数.如果您没有在子类构造函数中提供对超类构造函数的显式调用,那么Java将插入对无参数超类构造函数的隐式调用.这解释了为什么你看到超类构造函数的输出.

要删除该输出,可以执行以下操作之一:

1)从超类构造函数中删除输出语句.

2)在超类中创建另一个不输出任何内容的构造函数,并在子类构造函数中显式调用它.

JLS第8.8.7节规定:

如果构造函数体不以显式构造函数调用开始并且声明的构造函数不是原始类Object的一部分,那么构造函数体隐式地以超类构造函数调用"super();"开头,这是对构造函数的调用.它的直接超类不带参数.