哪个先执行,父或子构造函数?

时间:2015-12-28 10:00:53

标签: java inheritance constructor

我把这段代码放在编译器中

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” 的为什么吗 我会很感激这个案子的任何详细答案 并提及编译器将如何处理该

5 个答案:

答案 0 :(得分:2)

基类的构造函数(在您的情况下为类A)始终在您要实例化的类的构造函数之前执行(在您的情况下为类ConstractorDemo)。这就是A之前打印Demo的原因。

这个构造函数:

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

相当于:

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

答案 1 :(得分:2)

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

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

拇指规则

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

答案 2 :(得分:2)

首先调用子构造函数 。子构造函数中的第一行将是对super的调用。它给你一个错觉,即父母将首先被调用。但实际上,子类的构造函数调用父类的构造函数

答案 3 :(得分:0)

基类构造函数始终在类Level Constructor之前执行。它自动调用super类。因此,首先A将根据您的示例在Demo之后打印。谢谢

答案 4 :(得分:0)

每当调用子类的构造函数时,其中的第一个默认语句是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");  
}