package staticSuper;
class StaticSuper {
static {
System.out.println("super static block");
}
StaticSuper(){
System.out.println("super constructor");
}
}
public class StaticTests extends StaticSuper {
static {
System.out.println("static block");
}
StaticTests(){
System.out.println("main class");
}
public static void main(String args[]) {
System.out.println("in main");
}
}
结果:
super static blockstatic block
疑问:父类的static块的内容先于子类的static块的内容执行,感觉上就像是实例化子类时先实例化父类。可问题是两个类的构造函数中要求的输出统统都没有,因此引发了我的疑惑——第一,主类,就这里的staticTests到底有没有被实例化?能否用一个引用变量指向它?第二,如果被实例化了,为何能够绕过构造器?如果没有被实例化,那为什么运行了static中的内容?为什么父类中的static先于子类中的static?谢谢
1 回答
侃侃尔雅
TA贡献1801条经验 获得超16个赞
对象初始化过程:
(1) 主类的超类由高到低按顺序初始化静态成员
(2) 主类静态成员的初始化。
//创建实例时,如果不创建实例,则后面的不执行 ,你这了就没有创建实例
(3) 主类的超类由高到低进行默认构造方法的调用,在调用每一个超类的默认构造方法前,先对此超类进行非静态成员的初始化。
(4) 主类非静态成员的初始化。
(5) 主类的构造方法。
添加回答
举报
0/150
提交
取消