4

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

当我在 childClass 中按 ctrl+O 两次时,它显示继承的成员。但我碰巧在继承的成员中看到了超类的构造函数

但是据说构造函数不是继承的...

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

4

4 回答 4

8

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

来自继承文档

子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,所以子类不能继承,但是子类可以调用超类的构造函数。

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

于 2013-08-24T06:08:17.553 回答
4

只有成员是继承的,构造函数不被视为成员。

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

继承打算做的是,允许一个对象以与另一个更通用的对象相同的方式实例化。

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

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

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

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

于 2013-08-24T06:15:48.977 回答
1

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

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

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

于 2013-08-24T06:04:42.770 回答
0

构造函数不是成员,所以子类不能继承,但是子类可以调用超类的构造函数。

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

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

于 2013-08-24T06:08:37.147 回答