考虑有三个类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的未指定构造函数。
答案 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);
}