根据父子类来探究静态成员变量、静态代码块、非静态代码块、构造函数在实例化和不实例化时的执行顺序。
tips:
- main方法所在的类需要先加载和初始化
- 一个类要创建实例,必须先加载并初始化该类
- 一个类初始化就是执行clinit()方法,只执行一次,包括静态变量、静态代码块,按序执行
public class Father {
private int i = test();
private static int j = method();
static {
System.out.print("(1)");
}
Father(){
System.out.print("(2)");
}
{
System.out.print("(3)");
}
public int test() {
System.out.print("(4)");
return 1;
}
public static int method() {
System.out.print("(5)");
return 1;
}
}
public class Son extends Father {
private static int j = method();
private int i = test();
static {
System.out.print("(6)");
}
Son(){
super();//写不写都行,在子类构造器中一定会调用父类的构造器。
System.out.print("(7)");
}
{
System.out.print("(8)");
}
public int test() {
System.out.print("(9)");
return 1;
}
public static int method() {
System.out.print("(10)");
return 1;
}
public static void main(String[] args) {
//类初始化、实例初始化(实例初始化与类初始化不同,它可能有多个,new几次就有几个 )
Son s = new Son();
System.out.println();
Son s1 = new Son();
}
}

main方法为空时执行:
public static void main(String[] args){
}

cl class



面试题补充

传送门:https://www.bilibili.com/video/BV1nJ411M7ZJ?p=3

被折叠的 条评论
为什么被折叠?



