我在我的一篇试卷中看到了这个问题:
为什么派生类构造函数总是要访问基类构造函数?
我想知道这个问题是否有效?
因此,在您开始弄乱派生对象中的继承功能之前,您可能拥有一个“Base”类型的有效对象!
这是无效的。没有“应该”:它必须,并且编译器通过调用基类的默认构造函数(如果存在)来强制执行它,如果不存在则给你一个编译错误,这会迫使你调用现有的构造函数之一.
always有一个例外,超类中的默认构造函数通常不称为显式。
如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。Object 确实有这样的构造函数,所以如果 Object 是唯一的超类,则没有问题。
调用超类构造函数不是必须的,但应该与强烈建议配对 - 只要超类具有默认构造函数。否则编译器会强制你调用至少一个超类构造函数。
如果存在默认构造函数,则无论如何都会调用它,即使在子类构造函数中没有显式的 super() 语句。
类构造的一个可见部分是字段的初始化。但还有更多内容(内存分配、注册等)。所有这些都必须在创建派生类时对所有超类完成。
因为基类可能会做你不知道的工作。
因为基类可能有需要初始化的成员。
由于派生类构造函数要继承基类构造函数,所以需要调用基类构造函数。否则,如果不这样做,您将不会继承在基类构造函数中初始化的值。