【问题标题】:Java Constructor weird behaviourJava 构造函数奇怪的行为
【发布时间】:2013-04-13 13:20:56
【问题描述】:

我已经运行了这段代码

public class Redimix extends Concrete{

    Redimix(){
        System.out.println("r ");
    }

    public static void main(String[] args) {
        new Redimix();
    }

}

class Concrete extends Sand{
    Concrete() { System.out.print("c "); }
    private Concrete(String s) { }
}

abstract class Sand{
    Sand(){
        System.out.print("s ");
    }
}

它打印出s c r 但我所期待的是只有r 我的问题是什么是逻辑解释?

如果父基类是具有构造函数的抽象类,然后我们创建另一个类,然后将其扩展至基类(在我们的案例中 Concrete 扩展 Sand),然后我们创建另一个类,然后将其扩展至具体的类名(在我们的例子中是 redimix)会调用层次结构中的所有构造函数吗?(从上到下)

【问题讨论】:

    标签: java constructor chaining


    【解决方案1】:

    超类的构造函数总是作为构造函数的第一个动作被调用。

    如果您没有显式调用超类的构造函数,则会隐式调用 默认 构造函数(“无参数”构造函数)。

    【讨论】:

      【解决方案2】:

      没错。父对象的构造函数总是在子对象之前调用。这样可以确保对象处于有效状态,并且扩展了另一个类的对象始终可以知道该对象处于什么状态。

      这是您在编译器在您的行为中插入隐式构造函数调用后提供的代码。注意 super();总是先被调用。

      public class Redimix extends Concrete{
      
          Redimix(){
              super();
              System.out.println("r ");
          }
      
          public static void main(String[] args) {
              new Redimix();
          }
      
      }
      
      class Concrete extends Sand{
          Concrete() { super(); System.out.print("c "); }
          private Concrete(String s) { }
      }
      
      abstract class Sand{
          Sand(){
              super();  // invoking the constructor for java.lang.Object
              System.out.print("s ");
          }
      }
      

      【讨论】:

        【解决方案3】:

        在每个构造函数中,也会调用父构造函数。

        【讨论】:

          【解决方案4】:

          在每个构造函数中,第一条语句总是super(),它调用超类构造函数,除了Object

          【讨论】:

            【解决方案5】:

            为此,您需要了解constructor chaining。当您调用任何构造函数时,首先调用所有超类构造函数。在你的构造函数定义中,如果你没有一个编译器将添加一个无参数调用到超类构造函数类似这样:super();

            这是因为,必须先构建层次结构中的所有类,因为您的类依赖于它的超类。

            这个类到超类构造函数应该始终是你的构造函数定义中的第一条语句,因为它们必须在这个相关类之前构建。所以对象类的构造函数总是最先被执行的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-03-09
              相关资源
              最近更新 更多