Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么总是调用超类构造函数_Java_Inheritance_Superclass_Default Constructor - Fatal编程技术网

Java 为什么总是调用超类构造函数

Java 为什么总是调用超类构造函数,java,inheritance,superclass,default-constructor,Java,Inheritance,Superclass,Default Constructor,我有以下两门课 public class classA { classA() { System.out.println("A"); } } class classB extends classA { classB() { System.out.println("B"); } } 然后跑 1. 或 2. 总是给予 A B 为什么会这样?乍一看,在任何一种情况下,我都假设只调用classB构

我有以下两门课

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

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

1. 或

2. 总是给予

A
B

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

B

但这显然是错误的。

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

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

引述自:

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

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

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


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

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


两个语句之间的任何区别都是在对象创建之后

注意,对于类,您应该使用Java标准命名约定,其名称类似于
ClassA
ClassB
。以小写字符开头的名称表示变量。“我假设只调用
classB
构造函数,因此唯一的输出将是
B
”,但是
classB
的构造函数打印
A
。@totymedli感谢您指出这一点。据我所知,在哺乳动物的世界里,祖先通常是在其后代之前构建的。。可能Java原始设计人员模仿了相同的行为。@ThorbjørnRavnAndersen它们通常也用于非构造函数方法。
A
B
B