关于java:为什么总是调用超类构造函数

Why is super class constructor always called

本问题已经有最佳答案,请猛点这里访问。

我有以下两个班

1
2
3
4
5
6
7
8
9
10
11
public class classA {
    classA() {
        System.out.println("A");
    }
}

class classB extends classA {
    classB() {
        System.out.println("B");
    }
}

然后跑步

1
classA c = new classB();

1
classB c = new classB();

总是给予

1
2
A
B

为什么会这样?乍一看,在任何一种情况下,我都假定只调用classB构造函数,因此唯一的输出将是

1
B

但这显然是错误的。


Java就是这样工作的。在调用子类的构造函数之前,通过Object在类层次结构上一直调用父类的构造函数。

从文件中引用:

With super(), the superclass no-argument constructor is called. With super(parameter list), the superclass constructor with a matching parameter list is called.

Note: If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass. If the super class does not have a no-argument constructor, you will get a compile-time error. Object does have such a constructor, so if Object is the only superclass, there is no problem.

如果子类构造函数显式或隐式调用其超类的构造函数,您可能会认为将调用一整串构造函数,一直到EDOCX1的构造函数(0)。事实上,就是这样。它被称为构造函数链接,当类有很长的下降线时,您需要知道它。

< /块引用>


在构造过程中总是调用超类构造函数,它保证在调用子类构造函数之前完成超类构造。如果不是所有面向对象的语言,大多数情况下都是如此。如果不想调用默认构造函数,可以使用参数显式调用超类构造函数;否则,编译器会自动执行此类调用。


两个语句在所构造的对象方面没有区别,所以您可以看到相同的输出。

在使用new构造相同的对象时,只在左侧使用不同的引用类型就不会对对象创建和构造函数链接产生任何影响。

在创建对象之后,两个语句之间有什么不同。