为什么java中没有继承构造函数?
我是java编程语言的初学者,最近我研究了构造函数在java中不能继承,有人能解释一下为什么 我已经读过C++ 子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,因此它们不会被子类继承,但是可以从子类调用超类的构造函数为什么java中没有继承构造函数?,java,oop,inheritance,constructor,Java,Oop,Inheritance,Constructor,我是java编程语言的初学者,最近我研究了构造函数在java中不能继承,有人能解释一下为什么 我已经读过C++ 子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,因此它们不会被子类继承,但是可以从子类调用超类的构造函数 class A { A(); } class B extends A{ B(); } 您可以引用的文档,构造函数不是类的成员,只继承成员。您不能继承构造函数。也就是说,您不能使用子类的某个超类的构造函数创建子类的实例。简单地说,构造函数不能被继承,
class A {
A();
}
class B extends A{
B();
}
您可以引用的文档,构造函数不是类的成员,只继承成员。您不能继承构造函数。也就是说,您不能使用子类的某个超类的构造函数创建子类的实例。简单地说,构造函数不能被继承,因为在子类中它有不同的名称(子类的名称) 您只能执行以下操作:
B b = new B(); // and not new A()
相反,方法是用“相同的名称”继承的,并且可以使用
至于原因:
继承构造函数没有多大意义,因为类a的构造函数意味着创建类型a的对象,类B的构造函数意味着创建类型B的对象
您仍然可以在B的实现中使用A中的构造函数,不过:
class B extends A{
B() { super(); }
}
- 只能使用
调用构造函数。它不能作为方法调用new
- 构造函数名称与类名相同
- 在同一类中使用
李>此(…)
- 使用
的扩展类的李>super(…)
class A {
A() { } // Constructor
A(int a) { } // Constructor
A(boolean c) { } // Constructor
}
class B extends A {
B() {
this(3, 7);
}
B(int a) {
super();
}
B(String b) {
super(7);
}
B(int a, int c) { // Calls super() implicitly
}
}
A a = new B(8):
不幸的是,不可能将A的构造函数用于布尔值:
B b = new B(true): // ERROR
语言设计人员可以实现以下功能:
为基类中的每个公共构造函数生成一个具有相同签名的构造函数(如果尚未定义此类构造函数)。使用相同的参数调用super
。如果存在默认构造函数,则调用this()
这似乎有点臃肿的代码。而不仅仅是虚拟方法表中的指针,方法继承/重写就是通过它工作的。您所说的是Java语言级别的。若继承了构造函数,那个么就不可能使类私有化。正如我们所知,方法可见性不能降级<代码>对象类有一个无参数构造函数,每个类都扩展了
对象
,因此在构造函数继承的情况下,每个类都有一个无参数构造函数。这违反了OO原则
字节码级别上的情况有所不同。创建对象时,将调用两个运算符:
-noverify
参数来实现这一点
结论:
我观察到的简单答案是,您不能在子类中直接调用或使用父类的构造函数,但可以在子类中直接使用父类的方法 若在子类中有和父类同名的方法,那个么只需要使用“super”关键字来调用父类方法来解决调用歧义
要调用子类中的父类构造函数,您始终需要“super”关键字。所以父类构造函数和子类中的父类方法一样“不直接可用”,所以我们可以说构造函数不能被继承。不,构造函数不会被继承到子类,即使它是非静态成员,也不会被继承到子类,因为构造函数不会被加载到对象内部,它用于创建对象。构造函数与非静态初始值设定项类似,只有字段、方法和嵌套类是任何类的成员,而不是构造函数。子类从其超类继承所有成员(如字段、方法和嵌套类)。构造函数不是成员,因此它们不会被子类继承,但可以从子类调用超类的构造函数。如果在概念上有任何理由支持某个功能,通常可以绕过语法限制。因此,我认为,不支持构造函数继承的真正原因不是由于语法限制,而是由于语义。
class A {
A();
}
class B extends A{
B();
}
从概念上讲,继承提供了一种获取(或继承)行为的机制,而且很可能不需要编写任何代码,因为它的目的是提供代码重用。对于子类,它没有理由继承其父类的初始化行为。毕竟,当外部调用方可以使用继承行为而不知道是谁(在父链中)实际实现了它时,继承行为会找到最佳用途。正如您所看到的,调用方几乎不知道父类是如何通过其子类初始化的,因此没有明显的理由支持继承(父类的)构造函数。您不能继承构造函数,但可以像这样继承构造函数中的初始化值
class test1 {
int a,b;
test1(){
a = 100;
b = 20;
}
}
class test2 extends test1 {
test2(){
// do something
}
}
class test {
public static void main(String[] args) {
test2 t = new test2();
int a = t.a;
int b = t.b;
System.out.println(a+b);
}
}
米哈伊尔说没有;构造函数不是继承的 不能将构造函数从
超类
继承到子类
。然而,当一个对象在java中用“new”操作符实例化时,该对象将继承从它的子类到它的所有构造函数超类(父类)
,甚至包括抽象类中的构造函数(因为它们也是