1、代码
package com.aop8.classload;
public class Demo01 {
static {
System.out.println("静态代码块Demo01");
}
public static void main(String[] args) {
System.out.println("main方法");
System.out.println("=============================");
A a = new A();
System.out.println("=============================");
A a2 = new A();
System.out.println("=============================");
System.out.println(B.density);
System.out.println("=============================");
System.out.println(C.y);
System.out.println("=============================");
System.out.println(C.x);
}
}
class A extends A_Father {
public static int width = 100;
public static final int heigth = 200;
static {
System.out.println("静态代码块A");
width = 300;
}
public A() {
System.out.println("构造方法A");
}
}
class A_Father {
public static int capacity = 300;
public static int high = 50;
static {
System.out.println("静态代码块A_Father");
}
public A_Father() {
System.out.println("构造方法A_Father");
}
}
class B {
public static final double density = 0.52;
static {
System.out.println("静态代码块B");
}
}
class C extends C_Father {
public static int x = 12;
static {
System.out.println("静态代码块C");
}
}
class C_Father {
public static int y = 12;
static {
System.out.println("静态代码块C_Father");
}
}
2、运行结果:
静态代码块Demo01
main方法
=============================
静态代码块A_Father
静态代码块A
构造方法A_Father
构造方法A
=============================
构造方法A_Father
构造方法A
=============================
0.52
=============================
静态代码块C_Father
12
=============================
静态代码块C
12
3、分析:
代码开始由 public 这个类开始,加载这个类的时候,
首先看有没有静态的属性,以及静态的代码块(这里有静态代码块Demo01
)。
然后是 main 这个主方法,打印(main方法
),
然后是A a语句,这时候加载类A,因为A有父类,先加载父类,
对于父类还是先看其有没有静态的属性,代码块,这里父类打印(静态代码块A_Father
),
然后再加载子类,检查静态代码块(静态代码块A
),再执行语句new A,同样先打印父类(构造方法A_Father
),然后是子类的构造方法(构造方法A
)。
再次执行 A a2 的时候,不会再进行加载了,new A()的时候,构造方法还是会进行调用打印(构造方法 A_Father
)和(构造方法A
)。
在执行 B.density 的时候,因为其为 final 类型的,则其类不会加载。(假如其类型不是 final,只是static,则先打印 静态代码块B,再打印出其值 )。
然后是 C.y,直接加载父类 C_Father,则打印(静态代码块 C_Father
)。
然后在执行 C.x,加载类 C,打印(静态代码块C
)
参考
Java类的加载和代码执行顺序:
https://blog.csdn.net/qq_34993631/article/details/82890187