父类构造函数和子类构造函数哪个先执行?

9
我已经将这段代码放入编译器中。
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” 为什么? 我将感激任何对此情况的详细回答,并提到编译器将如何处理它


作为一个推论,要注意的是,如果一个类没有可访问的构造函数,则无法扩展该类。当调用子类的构造函数时,它立即尝试链接到其父类的构造函数。如果这个链接无法访问(比如说,它是私有的),那么子类的任何实例都无法被实例化。 - scottb
5个回答

5
在这种情况下,基类(在你的例子中是类A)的构造函数总是在你实例化的类(在你的例子中是ConstractorDemo类)的构造函数之前执行。这就是为什么A会先于Demo被打印出来的原因。
以下是需要翻译的内容:

这个构造函数:

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

等同于:

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

3
当你调用一个子类构造函数时,它会自动链接调用所有父类的构造函数,直到链到达Object类。
尽管你没有显式调用父类构造函数,但这并不意味着你只执行了子类构造函数。有一个有趣的事实是,在这个过程中(在你的代码中表示),你的父类构造函数(直到第n个父类,即Object类构造函数)也会被调用。当你调用任何子类构造函数时,你可以观察到从当前类到直接父类构造函数之间的链接调用。这种调用一直持续到Object类构造函数被调用,因为那是可能最顶层父类的超类。
注意事项:
- 如果你调用了特定的父类构造函数(super或super(args)),那么就会调用这个特定的父类构造函数。 - 如果你没有调用任何特定的构造函数,则默认的父类构造函数(super())会被调用。

3

首先调用的是子类构造器。在子类构造器里的第一行代码会调用super关键字,这会让你误认为是父类先被调用了。但实际上是子类的构造器调用了父类的构造器。


0
每当子类的构造函数被调用时,其中的第一个默认语句是super(); 这是由编译器自动添加的。
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");  
} 

0

基类构造函数始终在类级别构造函数之前执行。它会自动调用super类,所以首先会打印A,然后是根据您的示例打印Demo。谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接