首页 > 解决方案 > Java 类中的成员字段是否按声明顺序初始化?

问题描述

假设我有一个 Java 类,如下所示:

public class Example {
    private Foo foo = new Foo();
    private Bar bar = new Bar(this.foo);
}

是否保证bar将始终使用 aFoo作为其构造函数进行实例化,或者是否有机会将其实例化null

Java 类的成员初始化的顺序是否得到保证?

标签: java

解决方案


是的,这是有保证的。

特别是,JLS 12.5 Creation of New Class Instances说(强调添加):

  1. 执行此类的实例初始化程序和实例变量初始化程序,将实例变量初始化程序的值分配给相应的实例变量,按照它们在源代码中以文本形式出现的从左到右的顺序。如果执行这些初始化程序中的任何一个导致异常,则不会处理更多初始化程序,并且此过程会突然完成相同的异常。否则,继续执行步骤 5。

推荐阅读