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