首页 > 其他分享 >父子类内部初始化顺序

父子类内部初始化顺序

时间:2023-01-23 19:13:00浏览次数:43  
标签:初始化 顺序 args System 父子 Base static Hello out

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

相关文章