为什么实例化 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 初始值设定项而未调用构造函数。
我正在学习继承,并且正在使用这个具有 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 初始值设定项而未调用构造函数。