public class App {
private static App d = new App();
private SubClass t = new SubClass();
static
{
System.out.println(3);
}
public App()
{
System.out.println(4);
}
public static void main(String[] args)
{
System.out.println("Hello");
}
}
class SuperClass
{
SuperClass()
{
System.out.println("构造SuperClass");
}
}
class SubClass extends SuperClass
{
static
{
System.out.println(1);
}
public SubClass()
{
System.out.println(2);
}
}
结果
1
构造SuerClass
2
4
3
Hello
SubClass类是被App类所关联,所以要先加载SubClass类,先输出SubClass中静态代码块的代码--->1
然后执行private static App d = new App();
在这里说明,所有非静态代码的初始化过程实际是在这个类的构造器中执行:
通过反编译工具可知,代码private SubClass t = new SubClass();
实际执行过程是这样的: private SubClass t = null;
然后再构造器App()中执行:t = new SubClass();
而代码private static App d = new App(); 的实际执行过程是先声明 private static App d = null;
然后在静态代码块static{}中继续执行 d = new App();
综上所述,最底层的代码应该是
扫描二维码关注公众号,回复:
2674032 查看本文章
private static App d = null;
private SubClass t = null;
static
{
d = new App();
System.out.println(3);
}
public App()
{
t = new SubClass();
System.out.println(4);
}
public static void main(String[] args)
{
System.out.println("Hello");
}
即 先运行SubClass类的父类SuperClass类的构造器System.out.println("构造SuperClass");--->输出 构造SuperClass
然后运行SubClass类的构造器System.out.println(2);--->输出2
然后运行App类的构造器中的第二行代码System.out.println(4);--->输出4
然后运行App类中静态代码块static{}中第二行代码System.out.println(3);--->输出3
最终运行主方法中的System.out.println("Hello");--->输出Hello
如有出错,敬请指正!