这篇文章没有实际作用,不过为了让自己这笨脑袋在忘了的时候看到这段代码能记得是怎样的顺序。
package top.CSY.www;
public class App
{
private static App a=new App();
private subClass sub=new subClass();
static
{
System.out.println("3");
}
public App()
{
System.out.println("4");
}
public static void main(String[] args) {
System.out.println("Hello");
}
}
//父类
class surperClass
{
surperClass()
{
System.out.println("构造");
}
}
//子类
class subClass extends surperClass
{
static
{
System.out.println("1");
}
subClass()
{
System.out.println("2");
}
}
//运行结果???
下面看一下运行结果,并分析如何执行。
/*
1 :App类依赖于subClass类,所以得先把subClass类的字节码加载进JVM.
构造 :子类执行构造器时,需先调用父类无参构造.
2
4 :static初始化的代码/代码块,是在类的字节码加载进JVM时一并加载的.
3
Hello :main方法.
*/
值得一提的是:非static字段在初始化时是在构造器中优先执行的;我们可以看一下编译时java底层的代码.
public class App
{
private static App a = new App();
private subClass sub;
public App()
{
sub = new subClass();
System.out.println("4");
}
public static void main(String args[])
{
System.out.println("Hello");
}
static
{
System.out.println("3");
}
}
由此可清晰的看到代码是如何运行得到结果的。