繁体   English   中英

Java中的继承(默认构造函数)

[英]Inheritance in Java (default constructor)

考虑三个类A,B和C。类A没有构造函数,类B有构造函数,类C有参数化构造函数。 类似于下面的示例。


public class ClassA {

}

public class ClassB extends ClassA {

    public ClassB() {
        System.out.println("Default cons Class B");
    }

}

public class ClassC extends ClassB {

    public ClassC(int a, int b) {
        System.out.println("This is class C "+a+ "and"+ b );

    }
    public static void main(String args[]) {
        ClassC c = new ClassC(2,3);
    }
}

输出:

默认缺点C类

这是C 2and3类

问题1:

为了构造对象C,它构造了B,并且为了构造B,它首先构造了A。 即使在类A中没有定义任何默认构造函数,该程序也可以通过构造自己的默认构造函数来正常工作,而B类则调用super()。 我在这里没有问题,但是当我更改B类这样的东西时

public class ClassB extends ClassA {

    public ClassB(int a, int b) {
        System.out.println("This is class C "+a+ "and"+ b );
    }   
}

我收到一个错误

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Implicit super constructor ClassB() is undefined. Must explicitly invoke another constructor

    at ClassC.<init>(ClassC.java:4)
    at ClassC.main(ClassC.java:10)

为什么我们必须隐式指定超级构造函数ClassB(),即使在ClassA()中没有任何超级构造函数,第一个示例也可以正常工作。 我想知道默认情况下C的构造函数是否默认像B类一样调用B的未指定构造函数。

如果在一个类中至少指定一个构造函数,则不再为您创建默认构造函数。

如果未指定要在子类中调用哪个父构造函数,则默认情况下使用带有0参数的子构造函数。

由于您向类B添加了一个构造函数并使用了两个整数参数,因此您现在必须在C中像这样调用它,因为在类B中不再有不带参数的构造函数:

public ClassC(int a, int b) {
    super(a, b);
    System.out.println("This is class C "+a+ "and"+ b );
}

因为要创建C的实例,所以JVM会调用类层次结构的构造函数。

因此,当您创建C ,实际上首先要调用A的构造函数,然后是B ,然后是C 隐式地,如果未指定其他任何内容,则将调用super()

如果您创建一个显式接受参数的构造函数,则它将覆盖默认构造函数

public B() {
    //default constructor
}

这意味着Java将无法为您隐式调用它,因为Java不存在,因此您必须自己使用

public C(int a, int b) {
    super(a, b);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM