如果我有这样的事情:
public class SuperClass
{
SuperClass()
{
x = true;
}
public boolean x;
}
public class SubClass extends SuperClass
{
SubClass()
{
x = false;
}
}
最后我做了一个SubClass
对象 会x
是真的还是假的?从http://docs.oracle.com/javase/specs/jls/se5.0/html/execution.html#12.5看来,它是错误的。
从Java语言规范的12.5节开始(相关部分以粗体显示):
在返回对新创建对象的引用作为结果之前,使用以下过程处理指示的构造函数以初始化新对象:
将构造函数的参数分配给此构造函数调用的新创建的参数变量。
如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7节)开头(使用此方法),则使用相同的五个步骤评估参数并递归处理该构造函数调用。如果该构造函数调用突然完成,则该过程由于相同的原因突然完成;否则,请继续执行步骤5。
此构造函数并不以显式构造函数调用相同类中的另一个构造函数开始(使用此方法)。如果此构造函数用于Object以外的其他类,则此构造函数将以显式或隐式调用超类构造函数(使用super)开始。使用这五个步骤来递归评估超类构造函数调用的参数和过程。如果该构造函数调用突然完成,则出于相同原因,此过程也会突然完成。否则,请继续执行步骤4。
执行该类的实例初始值设定项和实例变量初始值设定项,并按从左到右的顺序将实例变量初始值设定项的值分配给相应的实例变量,这些变量在文本中显示在该类的源代码中。如果执行这些初始化程序中的任何一个导致异常,则不会再处理其他初始化程序,并且该过程会因相同的异常而突然完成。否则,请继续执行步骤5。
执行此构造函数的其余部分。如果该执行突然完成,则出于相同原因,此过程也会突然完成。否则,此过程将正常完成。
因此,将首先调用父类的构造函数(步骤3),并将其设置x
为true。在超类的构造函数以相同的步骤递归处理并完成后,子类的构造函数的主体会将其设置为false
(步骤5)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句