Java 中的继承 - 创建子类的对象也会调用超类的构造函数。究竟为什么?

2022-09-01 16:37:00

我有一个关于Java中继承的问题。

我有两个类,而类 B 继承 A:AB

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


public class B extends A {
     public B() {
         System.out.println("Bye!");
     }

     public static void main(String[] args) {
         B b = new B();
     }
}

当我运行程序B时,输出是:

Hi!
Bye!

:为什么调用 构造函数,当我创建和对象时?class Aclass B

我知道B继承了A的所有内容 - 所有实例或类变量以及所有方法,从这个意义上说,B的对象具有A的所有特征以及B中定义的其他一些特征。但是,我不知道也没有想到,当我创建B类型的对象时,A的构造函数也会被调用。所以,写这个:

B b = new B();

创建两个对象 - 一个是 B 类型对象,另一个是 A 类型对象。

这越来越有趣了,

有人可以解释为什么会发生这种情况吗?


答案 1

它不会创建两个对象,只会创建一个对象:B

从另一个类继承时,必须在构造函数中调用 super()。如果您不这样做,编译器将为您插入该调用,您可以清楚地看到。

调用超类构造函数是因为否则对象将处于未初始化状态,子类的开发人员可能不知道。

在编译器插入超级调用后,您的子类实际上如下所示:

public class B extends A {
    public B() {
        super();
        System.out.println("Bye!");
    }
}

答案 2

它不会创建 2 个对象,它只创建 B 的一个实例。调用超类构造函数的原因是,就像你说的,B 具有 A 的所有字段,并且这些字段需要初始化。


推荐