测试代码:
//父类
public class Base {
private int i = print("父类普通变量 i ");
private static int j = print("父类静态变量 j");
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类普通代码块");
}
public Base() {
System.out.println("父类构造方法");
}
static int print(String str) {
System.out.println(str);
return 2;
}
}
//子类
public class Son extends Base{
private int k = print("子类普通变量k");
private static int l = print("子类静态变量l");
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类普通代码块");
}
public Son() {
System.out.println("子类构造方法");
}
static int print(String str) {
System.out.println(str);
return 2;
}
}
//测试类
public class main {
public static void main(String[] args) {
Son son = new Son();
}
}
输出结果:
修改一下两个类中静态代码块和静态成员变量的位置并重新运行
//父类
public class Base {
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类普通代码块");
}
public Base() {
System.out.println("父类构造方法");
}
static int print(String str) {
System.out.println(str);
return 2;
}
private int i = print("父类普通变量 i ");
private static int j = print("父类静态变量 j");
}
//子类
public class Son extends Base{
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类普通代码块");
}
public Son() {
System.out.println("子类构造方法");
}
static int print(String str) {
System.out.println(str);
return 2;
}
private int k = print("子类普通变量k");
private static int l = print("子类静态变量l");
}
输出结果:
测试结果:
由测试结果可知:程序首先加载类,然后再对类进行初始化。
加载类的顺序为:先加载基类,基类加载完毕后再加载子类。
初始化的顺序为:先初始化基类,基类初始化完毕后再初始化子类。
最后得出类加载顺序为:先按照声明顺序初始化基类静态变量和静态代码块,接着按照声明顺序初始化子类静态变量和静态代码块,而后按照声明顺序初始化基类普通变量和普通代码块,然后执行基类构造函数,接着按照声明顺序初始化子类普通变量和普通代码块,最后执行子类构造函数。