为什么实例化 class 会输出 class 的内容?

Why does instantiating a class output the class's contents?

我正在学习继承,并且正在使用这个具有 superclass 和 subclass 的简单程序,如下所示。我的问题不是针对这个程序的;然而,这是我第一次看到这种情况发生的地方,所以我将它用作一个更一般的概念性问题的例子。

为什么简单的实例化class运行构造函数输出内容?我之前的理解是实例化class 只是创建对象,但它不会做任何事情。

SuperClass1.java

public class SuperClass1 {
            public SuperClass1(){        
                System.out.println("This is the superclass constructor.");
            }
        }

SubClass2.java

public class SubClass2 extends SuperClass1
{
    public SubClass2()
    {
        System.out.println("This is the subclass constructor.");
    }

}

Main.java

public class Main {

    public static void main(String[] args)
    {
        SubClass2 obj1 = new SubClass2(); // why should this print something?
    }
}

输出
这是超级class构造函数。
这是 subclass 构造函数。

首先,实例化对象意味着调用(并执行)构造函数,这就是它的用途。

所以,这个:

SubClass2 newInstance = <createNewInstance>;
newInstance.<init()>;

都是由Java中的构造函数调用new SubClass2()完成的。 "constructing" 对象和 "initialising" 其属性之间没有分隔。

此外,如果您没有显式调用超级 class 的另一个构造函数,那么在创建 class 的对象时,默认构造函数(不带参数的构造函数)将首先被自动调用。因此,实例化 subclass 的对象会调用 superclass 构造函数(打印第一行),然后自己打印第二行。

更详细地说,子class在幕后看起来像这样:

public class SubClass2 extends SuperClass1
{
    public SubClass2()
    {
        super();   // calls the superclass constructor
        System.out.println("This is the subclass constructor.");
    }
}

因为你调用的构造函数包含打印语句。

您调用构造函数方法 SubClass2(),其中有一个打印语句。

这些语句 打印,因为 class 已加载,但因为该 class 的对象已实例化并且调用了构造函数:

class 可以在不使用构造函数的情况下加载,如下代码所示:

public class Test {

    public static void main(String[] args) {
        try {
            Class.forName("Test$Inner");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    static class Inner {
        static {
            System.out.println("static initializer");
        }
        public Inner() {
            System.out.println("inner ctor");
        }
    }
}

运行 该程序显示仅调用静态 class 初始值设定项而未调用构造函数。