1. 静态代码块、代码块、构造函数的加载顺序
- 加载顺序从上到下
1. 父类静态代码块
2. 子类静态代码块
3. 父类代码块
4. 父类构造函数
5. 子类代码块
6. 子类构造函数
- 示例
public class Hello extends HelloBase{
static {
System.out.println("Hello: static.");
}
{
System.out.println("Hello: block.");
}
public Hello() {
System.out.println("Hello: no args constructor.");
}
public static void main(String[] args) {
Hello hello = new Hello();
}
}
class HelloBase {
static {
System.out.println("Base: static.");
}
{
System.out.println("Base: block.");
}
public HelloBase() {
System.out.println("Base: no args constructor.");
}
}
输出:
Base: static.
Hello: static.
Base: block.
Base: no args constructor.
Hello: block.
Hello: no args constructor.
2. 静态代码块只会初始化一次
静态代码块在类加载时执行,后续创建对象实例时不会重复执行。
示例:通过下面两种方式加载Hello这个类,仅执行静态代码块。
public static void main(String[] args) throws Exception {
// 加载Hello类
Class<?> clazz = Class.forName("com.example.test.Hello");
// 另一种加载方式
// Hello.class.getClassLoader().loadClass("com.example.test.Hello");
}
输出:
Base: static.
Hello: static.
标签:初始化,顺序,args,System,父子,Base,static,Hello,out
From: https://www.cnblogs.com/moyu1011/p/17065387.html