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

加了A(){}或在B(inti)构造函数中加super(i);才可以。。。... 加了A(){} 或在B(int i)构造函数中加super(i);才可以。。。 展开
 我来答
一口没水的枯井
推荐于2018-03-14 · TA获得超过2989个赞
知道小有建树答主
回答量:473
采纳率:100%
帮助的人:145万
展开全部

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) {
    }
}
Irreappearable
推荐于2016-02-07 · TA获得超过4956个赞
知道大有可为答主
回答量:1423
采纳率:25%
帮助的人:3102万
展开全部
原理是B类继承A类,所以B类的对象构造的时候必须先构造A类的部分,那么应该调用A的哪个构造函数? B类不知道,不知道就只好调用默认构造函数,但是没有。

所以有两种方法:
1. 给A类添加默认构造函数
2. 告诉B类的构造函数一开始先调用A类的A(int)这个特定的构造函数
更多追问追答
追问
单单上面的两个类,没有定义对象,为什么也不可以。就是定义对象的时候“B b=new B(1)”;这样也不可以?我是初学者,有很多不懂,希望大虾能帮忙。
追答
不可以
如果你定义对象,那么我已经说了,A类的部分如何创建?你必须告诉编译器
就算你不定义,你不能保证你之后不定义。这道理很简单,你不能写一个完全不符合java语法的方法,并期望它通过编译,仅仅因为你不去调用它
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式