class A{ A(int i){ } } class B extends A{ B(int i){ } } 为什么编译不行,原理是什么??

加了A(){} 或在B(int i)构造函数中加super(i);才可以。。。
2024-11-27 19:20:50
推荐回答(2个)
回答1:

1 编译不通过的原因

    类A中缺少 无参构造函数

2 解决方案

    给父类A添加一个无参构造函数

    正确的代码如下:

class A {
    A() {
    }
    A(int i) {
    }
}

class B extends A {
    B(int i) {
    }
}

3 分析

    在Java中,对于一个类来说

    如果它没有定义构造函数,则编译器会为其生成一个 无参构造函数

    如果它定义了构造函数,则编译器就不会为其生成无参构造函数了

    下述代码中,

class A {
 A(int i) {
    }
}

class B extends A {
    B(int i) {
    }
}

    类A中是没有无参构造函数的

    但是当B继承A,则要求父类A中必须有 无参构造函数

    所以报错

4 扩展

    如下代码也是正确

class A {
}

class B extends A {
    B(int i) {
    }
}

回答2:

原理是B类继承A类,所以B类的对象构造的时候必须先构造A类的部分,那么应该调用A的哪个构造函数? B类不知道,不知道就只好调用默认构造函数,但是没有。

所以有两种方法:
1. 给A类添加默认构造函数
2. 告诉B类的构造函数一开始先调用A类的A(int)这个特定的构造函数