为什么实例化一个类输出类的内容?

时间:2017-04-26 18:39:15

标签: java object inheritance printing instantiation

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

为什么简单地实例化类运行构造函数并输出内容?我之前的理解是实例化类只是创建了对象但它什么都不做。

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?
    }
}

输出
这是超类构造函数 这是子类构造函数。

3 个答案:

答案 0 :(得分:0)

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

所以,这个:

groupby

都是由Java中的构造函数调用SubClass2 newInstance = <createNewInstance>; newInstance.<init()>; 完成的。 “构造”对象和“初始化”其属性之间没有分离。

此外,如果您没有显式调用超类的另一个构造函数,则在创建类的对象时,会自动调用默认构造函数(没有参数的构造函数)。因此,实例化子类的对象会调用超类构造函数(打印第一行),然后打印第二行本身。

更详细的说,子类在场景后面看起来像这样:

new SubClass2()

答案 1 :(得分:0)

因为您调用的构造函数包含print语句。

您调用构造函数方法SubClass2(),其中包含print语句。

答案 2 :(得分:0)

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

以下代码演示了如何在不使用构造函数的情况下加载类:

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

运行该程序表明只调用了静态类初始化程序而没有构造函数。