Java中的继承(默认构造函数)
假设有三个类A、B和C。类A没有构造函数,类B有构造函数,类C有参数化构造函数。类似于下面给出的示例Java中的继承(默认构造函数),java,inheritance,Java,Inheritance,假设有三个类A、B和C。类A没有构造函数,类B有构造函数,类C有参数化构造函数。类似于下面给出的示例 输出: 默认cons类别C 这是C 2级和3级 问题1: 为了构造对象C,它构造B;为了构造B,它首先构造A。即使在定义的类A中没有任何默认构造函数,程序也可以通过构造自己的默认构造函数和B类调用super()来正常工作。我在这里没有问题,但是当我改变B类时,就像这样 public class ClassB extends ClassA { public ClassB(int
输出: 默认cons类别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)
线程“main”java.lang中出现异常。错误:未解决的编译问题:
隐式超级构造函数ClassB()未定义。必须显式调用另一个构造函数
在ClassC上。(ClassC.java:4)
在ClassC.main(ClassC.java:10)
为什么我们必须隐式地指定超级构造函数ClassB(),对于第一个示例,它工作得很好,即使ClassA()中没有任何超级构造函数。我想知道C的构造函数在默认情况下是否会调用B的未指定构造函数,就像它在类A中所做的那样。如果您在类A中指定至少一个构造函数,那么默认构造函数将不再为您创建 如果未指定在子类中调用哪个父构造函数,默认情况下将使用接受0个参数的父构造函数 由于您在类B中添加了一个构造函数,该构造函数接受两个整数参数,因此您现在必须在C中这样调用它,因为类B中不再有不接受参数的构造函数:
public ClassC(int a, int b) {
super(a, b);
System.out.println("This is class C "+a+ "and"+ 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将无法隐式地为您调用它,因为它不存在,所以您必须使用
public C(int a, int b) {
super(a, b);
}
因为要创建C的实例,JVM调用类层次结构的构造函数 因此,当您创建
C
时,实际上首先调用A
的构造函数,然后调用B
,然后调用C
的构造函数。如果没有指定其他内容,则隐式地调用super()
如果您创建一个显式接受参数的构造函数,那么它将覆盖默认构造函数
public B() {
//default constructor
}
这意味着Java将无法隐式地为您调用它,因为它不存在,所以您必须使用
public C(int a, int b) {
super(a, b);
}
默认构造函数不需要定义,只要您不定义另一个构造函数,它将包含public ClassA()。默认构造函数不需要定义,只要您不定义另一个构造函数,它将包含public ClassA()