我正在学习继承,并且正在使用这个具有超类和子类的简单程序,如下所示。我的问题并不是针对这个项目的;然而,这是我第一次看到这种情况发生的地方,因此我将其作为更一般概念性问题的一个例子。
为什么简单地实例化类运行构造函数并输出内容?我之前的理解是实例化类只是创建了对象但它什么都不做。
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?
}
}
输出
这是超类构造函数
这是子类构造函数。
答案 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");
}
}
}
运行该程序表明只调用了静态类初始化程序而没有构造函数。