何时调用Java Implicit Constructor与基类构造函数进行比较?

时间:2014-12-28 19:02:40

标签: java class inheritance constructor

如果我有这样的话:

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 看起来它会是假的。

2 个答案:

答案 0 :(得分:10)

来自Section 12.5 of the Java Language Specification(粗体相关部分):

  

在作为结果返回对新创建的对象的引用之前,处理指示的构造函数以使用以下过程初始化新对象:

     
      
  1. 将构造函数的参数分配给此构造函数调用的新创建的参数变量。

  2.   
  3. 如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7.1节)开头(使用此方法),则使用这五个相同步骤计算参数并以递归方式处理该构造函数调用。如果该构造函数调用突然完成,则此过程突然完成,原因相同;否则,继续步骤5.

  4.   
  5. 此构造函数不以同一类中另一个构造函数的显式构造函数调用开头(使用此方法)。如果此构造函数用于Object以外的类,则此构造函数将以超类构造函数的显式或隐式调用开始(使用super)。 使用这五个相同的步骤评估参数并以递归方式处理超类构造函数调用。如果构造函数调用突然完成,则此过程会因同样的原因而突然完成。否则,请继续执行步骤4.

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

  8.   
  9. 执行此构造函数的其余部分。如果执行突然完成,则此过程突然完成,原因相同。否则,此过程正常完成。

  10.   

因此将首先调用父类的构造函数(步骤3),将x设置为true。处理完超类的构造函数并以递归方式使用相同的步骤完成后,子类的构造函数的主体将其设置为false(步骤5)。

答案 1 :(得分:7)

在代码[*]的原始版本中,这两个类是无关的,BaseClass甚至不会编译,因为没有x声明或继承。< / p>

如果您将BaseClass作为SuperClass的子类,则x将为false,因为SuperClass的构造函数将在BaseClass之前运行1}}&#39; S

[*]在有人编辑问题之前添加extend SuperClass