java - 为什么总是调用父类(super class)构造函数

标签 java inheritance superclass default-constructor

我有以下两门课

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 的工作原理。在调用子类的构造函数之前,调用父类的构造函数,通过 Object 一直向上到类层次结构。

引自 the docs :

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.

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

关于java - 为什么总是调用父类(super class)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488484/

相关文章:

java - 解压缩(提取 zip)文件显示错误,存档意外结束

java - 从 playstore 安装后应用程序图标更改为默认图标

java - 继承:是在父类(super class)内部复制内容吗?

python - 最大公共(public)父类(super class)

java - 从重写的子类方法调用父类(super class)方法

如果签名不同,Java编译器禁止在内部类中创建与外部类同名的方法

java - 如何添加命令 XX :-UseSplitVerifier to an OSGi bundle built in CRXDE Lite (CQ5. 5)?

java - 我的模型的简单继承问题

java - java中未知的父变量问题

java - 将父类分配给Java中的子类变量