【问题标题】:Why aren't java class constructors inherited too? [duplicate]为什么java类构造函数也不能继承? [复制]
【发布时间】:2012-01-29 05:28:14
【问题描述】:

可能重复:
Java Constructor Inheritance

创建子类时,

  1. 为什么我必须创建一个构造函数并在每个 ctor 中写入 super?
  2. 如果我的行为与超类相似,我不应该期望继承它们吗?

【问题讨论】:

  • 可能已经回答了:stackoverflow.com/questions/1644317/…
  • 你不必在每个构造函数中都写super,这是必然的。假设超类有一个默认(公共无参数)构造函数。如果您在其中未指定构造函数,子类将隐式获得一个默认构造函数,该构造函数在编译时仅调用super();。您显式创建的任何构造函数都将隐式调用 super(); 作为其第一行——除非在构造函数的第一行中显式调用超类中的一个重载构造函数(例如,super(myParameter);)。跨度>

标签: java inheritance constructor


【解决方案1】:

构造函数不会被继承,因为您不是在创建超类的实例,而是在创建新类的实例。无法知道要调用哪个超类构造函数。

公平地说,默认值(无 arg 构造函数)始终存在。我假设这是您所指的特定 arg ctor。

【讨论】:

  • 如果您投反对票,请解释原因 - 我会努力让我的回答变得更好。
  • 只有当super中的默认值存在时才会存在默认值,也就是说如果所有的super构造函数都需要args,则默认构造函数不会被创建(或产生编译错误)
  • 无论何时创建一个类,它都会获得一个默认构造函数。不管超人中是否存在。
  • 嗨,让我感到奇怪的是,如果假设我在超类中有 3 个 Ctor。只继承一个是编译器正确的。现在,我希望如果我不继承 ctor 在创建子类时仍然可以使用。就像使用其中一种方法一样。我认为这没有问题。 jvm 会知道我使用哪个 ctor,因为它在超类中(顺便说一句:没有投票)
【解决方案2】:

实际上,java 总是为你的子类创建新的构造函数,但只是默认的,没有参数的构造函数。如果你的类有除了默认(无参数)构造函数之外的构造函数,你必须重新定义它们......构造函数不是行为方法,而是对象初始化(对于具有新属性的子类可能会改变)

【讨论】:

  • “总是”不正确。为没有构造函数声明的类提供默认构造函数。
【解决方案3】:

默认无参数构造函数默认被继承和调用。如果您想调用另一个,可以使用 super() 。如果无法使用默认构造函数,则必须使用 4 个可访问的超级构造函数

【讨论】:

  • 构造函数永远不会被继承。超类的无参数构造函数将被子类的默认构造函数调用,如果有的话。
【解决方案4】:

构造函数与类名同名,如果您能够将它们继承到子类中,它们就不能再是子类的构造函数。但是,默认的无参数构造函数总是被继承。

【讨论】:

  • 构造函数永远不会被继承。默认构造函数调用超类的无参数构造函数。
【解决方案5】:

调用构造函数从类蓝图创建对象,即初始化类的数据成员。如果子类要继承构造函数,那么在调用子类时,您还需要了解父类的数据成员。这不是人们在现实生活中会看到的。例如,如果您创建一个 Ferrari 类型的对象,您肯定会对初始化速度、加速度等参数感兴趣,并且您不会为初始化 Car 对象的参数而烦恼,即使 Ferrari 继承自 Car。因此,在调用 Ferrari 的构造函数时,您只会且只会关心 Ferrari 的成员,而不是其父类的成员。我希望我的观点清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2013-08-11
    • 2020-02-28
    • 2013-08-27
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多