Java对象初始化顺序
父类静态代码块、父类静态成员变量——同级,按代码顺序执行
子类静态代码块、子类静态成员变量——同级,按代码顺序执行
父类普通代码块、父类普通成员变量——同级,按代码顺序执行
父类构造方法
子类普通代码块、子类普通成员变量——同级,按代码顺序执行
子类构造方法
注意:静态内容只在类加载时执行一次,之后不再执行。
默认调用父类的无参构造方法,可以在子类构造方法中利用super指定调用父类的哪个构造方法
Father类
class Father {
public Father() {
System.out.println("父类无参构造方法");
}
static {
System.out.println("父类静态代码块1");
}
private static int a = Help.fatherStaticMemberVarInit();
static {
System.out.println("父类静态代码块2");
}
{
System.out.println("父类普通代码块1");
}
private int b = Help.fatherMemberVarInit();
{
System.out.println("父类普通代码块2");
}
public Father(int v) {
System.out.println("父类带参构造方法");
}
}
Son类
class Son extends Father {
static {
System.out.println("子类静态代码块1");
}
private static int a = Help.sonStaticMemberVarInit();
static {
System.out.println("子类静态代码块2");
}
{
System.out.println("子类普通代码块1");
}
private int b = Help.sonMemberVarInit();
{
System.out.println("子类普通代码块2");
}
public Son() {
// super(2018);
System.out.println("子类构造方法");
}
}
class Help {
public static int fatherStaticMemberVarInit() {
System.out.println("父类静态成员变量");
return 0;
}
public static int fatherMemberVarInit() {
System.out.println("父类普通成员变量");
return 0;
}
public static int sonStaticMemberVarInit() {
System.out.println("子类静态成员变量");
return 0;
}
public static int sonMemberVarInit() {
System.out.println("子类普通成员变量");
return 0;
}
}
Test类
public class Test {
public static void main(String[] args) {
Son son1 = new Son();
System.out.println("===================");
Son son2 = new Son();
}
}
结果图
//先跑父类静态代码块和父类静态成员变量,从头到尾按先后顺序来,代码块和成员变量同优先级,遇到哪个跑哪个;
//然后跑子类静态代码块和子类静态成员变量,从头到尾按先后顺序来,代码块和成员变量同优先级,遇到哪个跑哪个;
//再跑父类普通代码块和父类普通成员变量,从头到尾按先后顺序来,代码块和成员变量同优先级,遇到哪个跑哪个;
//跑完父类直接继续跑父类无参构造方法;
//跑完父类无参构造方法再跑子类普通代码块和子类普通成员变量,从头到尾按先后顺序来,代码块和成员变量同优先级,遇到哪个跑哪个;
//最后跑子类无参构造方法。
//静态内容只在类架子啊时执行一次,之后不再执行
//默认调用父类的无参构造方法,可以在子类构造方法中利用super指定调用父类的哪个构造方法。