繁体   English   中英

Java 静态块的执行顺序

[英]Order of execution for Java static blocks

我有2节课。 X类是Y类的父类。这两个类都有静态块。 我想知道静态块的执行顺序。

为什么 Block 3 在 Block 2 之前执行?

结果我得到:

结果我得到

Java代码:

class X{
    static String a = "ABC";

    static
    {
        a = a + "123";
        System.out.println("Static Block 1");
    }
    {
        a = "ABC123";
        System.out.println("Static Block 2");
    }
}

class Y extends X{
    static
    {
        a = a + "123ABC";
        System.out.println("Static Block 3");
    }
    {
        System.out.println("Static Block 4");
        System.out.println(a);
    }
}

public class MainClass {
    public static void main(String[] args) {
        Y y = new Y();
    }
}

static修饰符仅适用于紧随其后的块。 这意味着块 1 和 3 是static块,但块 2 和 4 是实例块,只有在实例化对象时才会调用。

考虑到这一点,执行顺序可以解释如下。

  • new Y()main方法调用,因此类加载器尝试加载类Y
  • 它看到类Y扩展了类X ,因此它尝试加载它。
  • 类加载器加载类X并执行其静态初始化程序(块 1)。
  • 类加载器完成加载类Y并执行其静态初始化程序(块 3)。
  • 尝试实例化Y ,因此首先调用X的底层初始化,并执行块 3。
  • Y实例的初始化通过执行块4完成。

静态块 1 静态块 2

实例块-1

实例块 2

0-arg构造函数

静态块-1

静态块 2 实例块 1

实例块 2

0-arg构造函数

0-arg method_1_

实例块-1

实例块 2

1-arg构造函数

1-arg 方法_2_

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM