为啥总是调用超类构造函数[重复]

Posted

技术标签:

【中文标题】为啥总是调用超类构造函数[重复]【英文标题】:Why is super class constructor always called [duplicate]为什么总是调用超类构造函数[重复] 【发布时间】:2016-04-02 00:07:56 【问题描述】:

我有以下两门课

public class classA 
    classA() 
        System.out.println("A");
    


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

然后运行

1

classA c = new classB();

2

classB c = new classB(); 

总是给予

A
B

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

B

但这显然是错误的。

【问题讨论】:

请注意,对于类,您应该使用 Java 标准命名约定,例如 ClassAClassB。以小写字符开头的名称表示变量。 "我假设只有classB 构造函数会被调用,因此唯一的输出是B" 但是classB 的构造函数会打印A... @totymedli 感谢您指出这一点。我让他们换了 据我所知,在哺乳动物的世界中,祖先通常是在其后代之前构建的。可能 Java 原始设计者模仿了相同的行为。 @ThorbjørnRavnAndersen 它们通常也用于非构造方法。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

引用the docs:

使用super(),调用超类无参数构造函数。使用super(parameter list),调用具有匹配参数列表的超类构造函数。

注意: 如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。 Object 确实有这样的构造函数,所以如果 Object 是唯一的超类,那没有问题。

如果子类构造函数显式或隐式调用其超类的构造函数,您可能会认为将调用整个构造函数链,一直到Object 的构造函数。事实上,情况就是这样。它被称为构造函数链,当有很长的类下降时你需要注意它。

【讨论】:

【参考方案3】:

就正在构造的对象而言,这两种语句没有区别,因此您会看到相同的输出。

在使用new 构造相同的对象时,仅在左侧使用不同的引用类型,就对象创建和构造函数链接而言,不会有任何区别。

你的两个语句之间有什么区别是在对象被创建之后。

【讨论】:

以上是关于为啥总是调用超类构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的继承——创建子类的对象也会调用超类的构造函数。为啥?

为啥需要自定义异常类[重复]

为啥并不总是有默认构造函数[重复]

为啥在按值返回时总是调用复制构造函数

为啥构造函数总是与类具有相同的名称以及它们是如何被隐式调用的?

从构造函数的主体调用超类构造函数