为什么构造函数不能在java中继承?

May*_*ari 40 java inheritance constructor

我是java编程语言的初学者,最近我研究过构造函数不能在java中继承,有谁能解释一下为什么

我已经阅读了C++的这个链接

Lak*_*ake 36

简单来说,构造函数不能被继承,因为在子类中它具有​​不同的名称(子类的名称).

class A {
   A();
}

class B extends A{
   B();
}
Run Code Online (Sandbox Code Playgroud)

你只能这样做:

B b = new B();  // and not new A()
Run Code Online (Sandbox Code Playgroud)

相反,方法使用"相同名称"继承并可以使用.

至于原因:继承构造函数没有多大意义,因为类A的构造函数意味着创建类型A的对象,而类B的构造函数意味着创建类B的对象.

您仍然可以使用 A内部B的实现中的构造函数:

class B extends A{
   B() { super(); }
}
Run Code Online (Sandbox Code Playgroud)

  • “构造函数不能被继承,因为在子类中它有不同的名称” - 这是什么语言的设计选择!罗特夫。我们想让类难以继承、难以折射,并且构造函数难以编写。要么就是他们太喜欢这种自命名构造函数的想法,以至于他们拒绝或从未想过重新命名它们。我们这样做了,所以它必须作为传统永远延续下去。 (2认同)

Mik*_*ail 16

你在说什么是Java语言水平.如果构造函数是继承的,那么就不可能使类成为私有的.我们知道方法可见性不能降级.Objectclass有一个无参数构造函数,每个类都扩展Object,所以在构造函数继承的情况下,每个类都有一个无参数构造函数.这打破了OO原则.

字节码级别上的情况有所不同.创建对象时,会调用两个运算符:

  1. new - 为对象分配内存
  2. invokespecial - 在新分配的内存块上调用构造函数

我们可以修改字节码,以便为Child类分配内存,并从Parent类调用构造函数.在这种情况下,我们可以说构造函数是继承的.如果我们不关闭字节码验证,JVM将在加载类时抛出异常.我们可以通过添加-noverify参数来实现.

结论:

  1. 由于OO原则,构造函数不会在语言级别上继承
  2. 构造函数在字节码级别上继承


Sur*_*tta 12

继承文档中提到的原因

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

您可以参考为您的类提供构造函数的文档

  • 先生,我也读过这个,构造函数是类的特殊成员函数,其名称与类的名称相同,但它们没有任何返回类型。这是真的吗? (2认同)
  • @user2320537 如果你的意思是“数据类型”意味着“返回类型”,是的,它们没有任何“返回类型”。 (2认同)