Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java中没有继承构造函数?_Java_Oop_Inheritance_Constructor - Fatal编程技术网

为什么java中没有继承构造函数?

为什么java中没有继承构造函数?,java,oop,inheritance,constructor,Java,Oop,Inheritance,Constructor,我是java编程语言的初学者,最近我研究了构造函数在java中不能继承,有人能解释一下为什么 我已经读过C++ 子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,因此它们不会被子类继承,但是可以从子类调用超类的构造函数 class A { A(); } class B extends A{ B(); } 您可以引用的文档,构造函数不是类的成员,只继承成员。您不能继承构造函数。也就是说,您不能使用子类的某个超类的构造函数创建子类的实例。简单地说,构造函数不能被继承,

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

我已经读过C++

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

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原则

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

  • -为对象分配内存
  • -对新分配的内存块调用构造函数
  • 我们可以修改字节码,以便为子类分配内存,并从父类调用构造函数。在这种情况下,我们可以说构造函数是继承的。请注意,如果我们不关闭字节码验证,JVM将在加载类时引发异常。我们可以通过添加
    -noverify
    参数来实现这一点

    结论:

  • 由于OO原则,构造函数不会在语言级别继承
  • 构造函数是在字节码级别继承的

  • 我观察到的简单答案是,您不能在子类中直接调用或使用父类的构造函数,但可以在子类中直接使用父类的方法

    若在子类中有和父类同名的方法,那个么只需要使用“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”操作符实例化时,该对象将继承从它的子类到它的所有构造函数
    超类(父类)
    ,甚至包括抽象类中的构造函数(因为它们也是