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