我正在学习有关如何使用this()
重载的构造函数,并遇到了以下限制:
您不能在调用this()时使用构造函数类的任何实例变量。
例如:
class Test{ int x; public Test() { this(x); //Does not compile } public Test(int y) {} void method1() { method2(x); //OK } void method2(int y) {} }
我知道不需要将实例字段传递给构造函数,因为默认情况下它是可见的。但是,为什么相同的限制不适用于实例方法?
Java中还有另一个要求:构造函数调用(this()
必须在任何构造函数中首先执行使用。构造函数将初始化对象。
之后,在这些初始调用之后将实例字段初始化。因此,由于现在已经很好地定义了字段值,因此您可以将它们用于任何东西,包括调用其他方法。
但是,在初始构造函数调用之前,这些字段处于未定义状态,并且不能用作其他构造函数调用的参数。
对于这些事情,您需要查看JLS:
如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7节)开头(使用此方法),则使用相同的五个步骤评估参数并以递归方式处理该构造函数调用。如果该构造函数调用突然完成,则该过程由于相同的原因突然完成;否则,请继续执行步骤5。
执行此类的实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序在文本中显示在该类的源代码中,然后将其分配给相应的实例变量。如果执行这些初始化程序中的任何一个导致异常,则不会再处理其他初始化程序,并且该过程会因相同的异常而突然完成。否则,请继续执行步骤5。
因此,实例变量仅在构造函数调用之后初始化。这是有道理的,因为首先为它分配默认值(零或null),然后从构造函数中为其分配另一个值会很奇怪。