Java:始终保证在构造函数之外的成员初始化被调用吗?

时间:2012-04-16 17:27:29

标签: java

如果我在构造函数之外初始化成员变量,该成员何时实际初始化?是否保证为该类的所有可能构造函数初始化?

public class MyClass
{
    private String myName = "MyClass";

    public MyClass(int constructor1Arg)
    {}

    public MyClass(int constructor2Arg1, int constructor2Arg2)
    {}
}

3 个答案:

答案 0 :(得分:14)

是。所有实例变量初始化程序在超级构造函数执行后执行,但之前在此类中声明的任何构造函数的主体。

(正如Jigar Joshi所提到的,这是假设超级构造者正常执行。)

答案 1 :(得分:3)

是的,如果在创建对象时没有异常

答案 2 :(得分:3)

根据Java语言规范:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5

调用构造函数之前初始化实例变量,除非之前的任何初始化都抛出错误:

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

(步骤5正在运行构造函数)