【问题标题】:Which executed first, The parent or the child constructor?哪个先执行,父构造函数还是子构造函数?
【发布时间】:2016-04-02 04:10:16
【问题描述】:

我已将这段代码放入编译器中

package com.employer.constractor;

public class ConstractorDemo extends A{
    public ConstractorDemo(){
        System.out.print("Demo");
    }
    public static void main(String[] args){
        new ConstractorDemo();
    }
}

class A {
    A(){
        System.out.print("A");
    }
}

它给了“ADemo” 为什么? 我将不胜感激此案的任何详细答案 并提及编译器将如何准确处理该问题

【问题讨论】:

  • 作为推论,请注意不能扩展没有可访问构造函数的类。当调用子类构造函数时,它会立即尝试链接到其父类的构造函数。如果它不能被访问(因为,比如说,它是私有的),那么子类的任何实例都不能被实例化。

标签: java inheritance constructor


【解决方案1】:

基类的构造函数(在你的例子中是类A)总是在你正在实例化的类的构造函数之前执行(在你的例子中是类ConstractorDemo)。这就是为什么ADemo 之前打印。

这个构造函数:

public ConstractorDemo(){
    System.out.print("Demo");
}

相当于:

public ConstractorDemo(){
    super (); // prints A
    System.out.print("Demo"); // prints Demo
}

【讨论】:

    【解决方案2】:

    首先调用子构造函数。子构造函数的第一行将是对 super 的调用。 WHich 让您产生先调用父级的错觉。但实际上子类的构造函数调用父类的构造函数

    【讨论】:

      【解决方案3】:

      当您调用子构造函数时,它会自动将调用链接到它的所有超类,直到链接到达 Object 类。

      虽然您没有调用超类构造函数,但这并不意味着您只执行子类构造函数。有一个有趣的事实是,您的超类构造函数(直到第 n 个超类,即 Object 类构造函数)也在该过程中调用(显示在您的代码中)。您可以在调用任何 Child 构造函数时观察到。从当前类对直接父类构造函数进行链式调用。并且调用一直持续到 Object 类构造函数调用,因为可能的大多数 Parent 类超类是。

      拇指规则

      • 如果调用任何特定的超级构造函数(super 或 super(args)), 然后调用特定的超级构造函数。
      • 如果你没有调用任何特定的构造函数,那么默认 super 构造函数(super()) 调用。

      【讨论】:

        【解决方案4】:

        基类构造函数总是在类 Level Constructor 之前执行。它自动调用super 类。所以首先A将打印然后Demo按照你的例子。谢谢

        【讨论】:

          【解决方案5】:

          每当调用子类的构造函数时,其中的第一个默认语句就是 super();由编译器自动添加,
          超级();将调用超类的构造函数,因此,它首先会执行 A(),然后是 ConstractorDemo()
          参考这个:https://www.javatpoint.com/super-keyword

          即使你想指定 super();它必须是构造函数的第一条语句,否则它会给你编译时错误!

          你的构造函数是这样的:

          public ConstractorDemo()
          {  
             super(); // u didn't specified this but compiler will automatically add it  
             System.out.print("Demo");  
          } 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-12
            • 1970-01-01
            • 2018-01-31
            • 1970-01-01
            • 1970-01-01
            • 2014-03-06
            • 1970-01-01
            • 2018-02-28
            相关资源
            最近更新 更多