note:
只涉及到静态代码块、构造代码块、构造方法的加载顺序。
父类和子类的代码如下:
//父类
public class A{
static{
System.out.println("A静态代码块");
}
{
System.out.println("A构造代码块");
}
A(){
System.out.println("A构造方法");
}
}
//子类
public class C extends A{
static{
System.out.println("C静态代码块");
}
{
System.out.println("C构造代码块");
}
C(){
System.out.println("C构造方法");
}
}
1、入口在父类A中
第一种情况:
A类创建空main入口
运行结果:
A静态代码块
结果分析:
入口在A类内,没有继承父类,只加载A类。
第二种情况:
A类main方法内创建A对象;
A a = new A();
运行结果:
A静态代码块
A构造代码块
A构造方法
结果分析:
构造代码块优先于构造方法执行;
首先加载A类静态代码块,main中创建A对象,执行A的构造代码块,在执行A的构造方法。
第三种情况:
A类main方法内创建A对象和C对象;
A a = new A();
C c = new C();
运行结果:
A静态代码块
A构造代码块
A构造方法
C静态代码块
A构造代码块
A构造方法
C构造代码块
C构造方法
结果分析:
先加载A对象,在创建C对象,执行C静态代码块,C类继承了父类,先加载父类构造代码块和构造方法,在加载本类的构造代码块和构造方法。
第四种情况:
A类main方法内创建C对象和A对象;
C c = new C();
A a = new A();
运行结果:
A静态代码块
C静态代码块
A构造代码块
A构造方法
C构造代码块
C构造方法
A构造代码块
A构造方法
结果分析:
入口在A类,加载A类静态代码块,创建C类对象,加载C类静态代码块,C继承A,执行A的构造代码块和A的构造方法,在执行C的构造代码块和构造方法。创建A类对象,A静态代码块只执行一次,执行A本类的构造代码块和构造方法。
第五种情况:
A类定义静态变量:
public static int a = 10;
main方法内输出a变量。
System.out.println("a = "+A.a);
运行结果:
A静态代码块
a = 10
结果分析:
A本类输出静态变量
第六种情况:
C类定义静态变量:
public static int c = 10;
main方法内输出c变量。
System.out.println("c = "+C.c);
运行结果:
A静态代码块
C静态代码块
c = 10
结果分析:
加载A在加载C静态代码块,输出静态变量。
2、入口在子类C中
第一种情况:
C类创建空main入口
运行结果:
A静态代码块
C静态代码块
结果分析:
入口在C类内,父类是A类,先加载A类静态代码块在,加载C类。
第二种情况:特别注意
C类main方法内创建A对象;
C a = new C();
运行结果:
A静态代码块
C静态代码块
A构造代码块
A构造方法
C构造代码块
C构造方法
结果分析:
构造代码块优先于构造方法执行;
首先加载A类的在加载C类静态代码块,main中创建C对象,先执行父类A的构造代码块和构造方法,在执行C的构造代码块和构造方法。
第三种情况:
C类main方法内创建C对象和A对象;
C c = new C();
A a = new A();
运行结果:
A静态代码块
C静态代码块
A构造代码块
A构造方法
C构造代码块
C构造方法
A构造代码块
A构造方法
结果分析:
首先加载A类的在加载C类静态代码块,main中创建C对象,先执行父类A的构造代码块和构造方法,在执行C的构造代码块和构造方法。在创建A对象加载A的构造代码块和构造方法。
第四种情况:特别注意
C类main方法内创建A对象和C对象;
A a = new A();
C c = new C();
运行结果:
A静态代码块
C静态代码块
A构造代码块
A构造方法
A构造代码块
A构造方法
C构造代码块
C构造方法
结果分析:
入口在C类,继承A类,加载A类静态代码块,在加载C类静态,创建A类对象,执行A本类的构造代码块和构造方法。,执行A类的构造代码块和构造方法,在创建C的对象,先执行父类A类的构造代码块和构造方法,在执行C本类的构造代码块和构造方法。
第五种情况:
C类定义静态变量:
public static int c = 10;
main方法内输出c变量。
System.out.println("c = "+C.c);
运行结果:
A静态代码块
C静态代码块
c = 10
结果分析:
加载A在加载C静态代码块,输出静态变量。
第六种情况:
A类定义静态变量:
public static int a = 10;
main方法内输出c变量。
System.out.println("a = "+A.a);
运行结果:
A静态代码块
C静态代码块
a = 10
结果分析:
加载A在加载C静态代码块,输出静态变量。