如果我在构造函数之外初始化一个成员变量,该成员什么时候真正被初始化?是否保证为类的所有可能的构造函数初始化?
public class MyClass
{
private String myName = "MyClass";
public MyClass(int constructor1Arg)
{}
public MyClass(int constructor2Arg1, int constructor2Arg2)
{}
}
如果我在构造函数之外初始化一个成员变量,该成员什么时候真正被初始化?是否保证为类的所有可能的构造函数初始化?
public class MyClass
{
private String myName = "MyClass";
public MyClass(int constructor1Arg)
{}
public MyClass(int constructor2Arg1, int constructor2Arg2)
{}
}
是的。所有实例变量初始化器都在超级构造函数执行之后执行,但在此类中声明的任何构造函数的主体之前执行。
(正如 Jigar Joshi 提到的,这是假设超级构造函数正常执行。)
根据 Java 语言规范:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5
实例变量在调用构造函数之前被初始化,除非任何先前的初始化抛出错误:
执行该类的实例初始化程序和实例变量初始化程序,将实例变量初始化程序的值分配给相应的实例变量,按照它们在源代码中以文本形式出现的从左到右的顺序。如果执行这些初始化程序中的任何一个导致异常,则不会处理更多初始化程序,并且此过程会突然完成相同的异常。否则,继续执行步骤 5。
(第 5 步是运行构造函数)
是的,如果在创建对象时没有异常