为什么构造函数不是inheritance的?

我一直在使用Eclipse Juno学习inheritance中的构造函数。

当我在childClass中按两次ctrl + O时,它显示inheritance的成员。 但我偶然看到inheritance成员中的超类构造函数

但据说构造函数不是inheritance的……

有人可以解释一下这种行为吗?

与字段,方法和嵌套类不同,构造函数不是类成员。

来自inheritance的文档

子类从其超类inheritance所有成员(字段,方法和嵌套类)。 构造函数不是成员,因此它们不是由子类inheritance的,但是可以从子类调用超类的构造函数。

但为什么构造函数从类成员中删除?

仅inheritance成员 ,并且不将构造函数视为成员。

要理解为什么构造函数不是inheritance的,请考虑OOP中的inheritance是允许将对象视为另一个更通用的对象的机制的一部分。 这要求inheritance所有数据成员和所有方法。

inheritance不是要做的,是允许一个对象以与另一个更通用的对象相同的方式实例化

这是因为构造函数必须将对象初始化为有效状态,并且为超类对象初始化有效状态的足够信息可能不足以初始化子类对象的有效状态!

要解决此问题, 如果构造函数是inheritance的 ,当您从库中扩展类时,您必须手动选择退出不希望inheritance的构造函数。 这很麻烦且容易出错,因为当该库的新版本在该基类中出现更多构造函数时,您自己的类现在会受到无效初始化(通过泄漏的构造函数),除非您也发布了更新。 或者可能是在您自己的超类中添加构造函数会“破坏”您自己的子类,您必须转到每个子类并选择退出新的子类。 换句话说, 您的代码的有效性将与您使用的基础更紧密地耦合

另一方面,“选择加入”,通过显式定义自己的构造函数并将它们与基类的构造函数链接起来,实际上更有意义,并且对组件的有效性更安全。 这种选择是通过链接来完成的,即在另一个构造函数的开头调用基类构造函数的过程。

现在Eclipse(我没有使用它,所以我基于你在你的问题中描述的内容)可能会列出可用于链接的构造函数,因为查找它们是一种非常常见的情况(除非你’重新调用一个非常简单或无参数的构造函数)。 换句话说,为方便起见,构造函数列在inheritance成员中,但正如我们所说,严格来说,它们不是inheritance的。

构造函数是链接的:您编写的每个构造函数最终都必须调用其中一个超类构造函数。 例:

public class MyException extends RuntimeException { public MyException(String message) { super(message); // invokes RuntimeException(String) constructor } } 

super(...)this(...)构造函数调用(如果有)必须作为构造函数中的第一个语句出现。 如果这两者都没有指定,则隐式假设super() ,它将链接到超类的默认构造函数。 (如果超类没有默认构造函数,那么编译将失败。)

构造函数不是成员,因此它们不是由子类inheritance的,但是可以从子类调用超类的构造函数。

资料来源: http : //docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

使用Ctrl + O的Eclipse方法帮助显示了您可以从当前类调用的所有方法。 因此,父构造函数也会显示在其中,因为您可以使用super调用它。