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

时间:2016-01-26 20:24:11

标签: java inheritance

考虑有三个类A,B和C.A类没有构造函数,ClassB有构造函数,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 2级和3级

问题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&#39的构造函数是否像对A类一样调用B&#39的未指定构造函数。

2 个答案:

答案 0 :(得分:4)

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

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

由于你向B类添加了一个带有两个整数参数的构造函数,你现在必须在C中调用它,因为不再有一个在B类中没有参数的构造函数:

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

答案 1 :(得分:1)

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

因此,当您创建C时,您实际上首先调用A的构造函数,然后调用B的构造函数,然后调用C的构造函数。隐含地,如果没有指定其他内容,则调用super()

如果创建一个显式获取参数的构造函数,那么它将覆盖默认构造函数

public B() {
    //default constructor
}

这意味着Java无法隐式调用它,因为它不存在,所以你必须自己调用它

public C(int a, int b) {
    super(a, b);
}
相关问题