Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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_Inheritance - Fatal编程技术网

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

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

假设有三个类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 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()