Java 使用 super 关键字继承
Java inheritance using super keyword
我在我的程序中使用继承和超级函数,但是当我扩展我的 class 时它显示错误消息 "There is no default constructor in 'cc'. "。此错误消息是在扩展第一个子 class 并尝试创建第二个子 class 之后出现的。这是代码
class aa{
int i=-1;
int show(){
return i;
}
}
class bb extends aa{
int i;
bb(int g,int j){
super.i=g;
i=j;
}
}
class cc extends bb {
int j,k;
cc(int i, int j,int k) {
super(i,j);
super.i=i;
this.j=j;
this.k=k;
}
}
class dd extends cc{ // here the error showing
int h; //" There is no default constructor in 'cc' "
void hello(){
System.out.println("hello");
}
}
class SuperUseExample3 {
public static void main(String[] args) {
aa x = new aa();
System.out.println("value of a = "+x.i);
bb y = new bb(8,2);
System.out.println("value of a in class cc = "+y.show());
System.out.println("value of b in class bb = "+y.i);
cc z =new cc(12,13,14);
System.out.println("value of a in class cc = "+z.show());
System.out.println("value of b in class cc = "+z.j);
System.out.println("value of c in class cc = "+z.k);
}
}
cc
class构造函数是
cc(int i, int j,int k) {
}
因此,您需要在dd
中调用super(i, j, k)
。例如:
class dd extends cc{
int h;
dd(int i, int j,int k) {
super(i, j, k);
}
void hello(){
System.out.println("hello");
}
}
您的 cc
class 有一个接受参数的构造函数:
cc(int i, int j, int k) {}
如果您想继承cc
,您必须:
- 在您的
dd
构造函数中调用 super(int i, int j, int k)
来调用 cc
的构造函数,传递构造函数所需的参数。
- 或者为
cc
创建一个不带参数的默认构造函数:cc() {}
。如果你不调用super()
,默认会调用这个构造函数。
问题是 dd 扩展了 cc,它有一个 cc(int i, int j, int k) 的构造函数,但是 dd 的构造函数没有调用它。
您需要向 dd 添加一个调用 super(i, j, k) 的构造函数。
dd 的示例代码:
}
class dd extends cc{
dd(int i, int j, int k) {
super(i, j, k);
}
int h;
void hello(){
System.out.println("hello");
}
您正在扩展 class cc in dd。但是在 dd 中你没有初始化 cc 拥有的任何东西,这是错误的,因为当调用 dd 时它正在搜索它的 superclass 的构造函数并且当没有定义构造函数时 java 需要一个没有默认参数构造函数。所以它在 cc 中调用该参数,但你没有在 cc 中定义任何空白参数,所以它说它只有 1 构造函数,你需要创建其他空白构造函数。
dd
继承了 cc
,因此它必须调用 cc
的默认构造函数,目前不存在。
要解决这个问题,只需添加一个不带参数的构造函数
class cc extends bb {
int j,k;
cc(){
//do whatever you want
}
..//rest of code
}
我在我的程序中使用继承和超级函数,但是当我扩展我的 class 时它显示错误消息 "There is no default constructor in 'cc'. "。此错误消息是在扩展第一个子 class 并尝试创建第二个子 class 之后出现的。这是代码
class aa{
int i=-1;
int show(){
return i;
}
}
class bb extends aa{
int i;
bb(int g,int j){
super.i=g;
i=j;
}
}
class cc extends bb {
int j,k;
cc(int i, int j,int k) {
super(i,j);
super.i=i;
this.j=j;
this.k=k;
}
}
class dd extends cc{ // here the error showing
int h; //" There is no default constructor in 'cc' "
void hello(){
System.out.println("hello");
}
}
class SuperUseExample3 {
public static void main(String[] args) {
aa x = new aa();
System.out.println("value of a = "+x.i);
bb y = new bb(8,2);
System.out.println("value of a in class cc = "+y.show());
System.out.println("value of b in class bb = "+y.i);
cc z =new cc(12,13,14);
System.out.println("value of a in class cc = "+z.show());
System.out.println("value of b in class cc = "+z.j);
System.out.println("value of c in class cc = "+z.k);
}
}
cc
class构造函数是
cc(int i, int j,int k) {
}
因此,您需要在dd
中调用super(i, j, k)
。例如:
class dd extends cc{
int h;
dd(int i, int j,int k) {
super(i, j, k);
}
void hello(){
System.out.println("hello");
}
}
您的 cc
class 有一个接受参数的构造函数:
cc(int i, int j, int k) {}
如果您想继承cc
,您必须:
- 在您的
dd
构造函数中调用super(int i, int j, int k)
来调用cc
的构造函数,传递构造函数所需的参数。 - 或者为
cc
创建一个不带参数的默认构造函数:cc() {}
。如果你不调用super()
,默认会调用这个构造函数。
问题是 dd 扩展了 cc,它有一个 cc(int i, int j, int k) 的构造函数,但是 dd 的构造函数没有调用它。
您需要向 dd 添加一个调用 super(i, j, k) 的构造函数。
dd 的示例代码:
}
class dd extends cc{
dd(int i, int j, int k) {
super(i, j, k);
}
int h;
void hello(){
System.out.println("hello");
}
您正在扩展 class cc in dd。但是在 dd 中你没有初始化 cc 拥有的任何东西,这是错误的,因为当调用 dd 时它正在搜索它的 superclass 的构造函数并且当没有定义构造函数时 java 需要一个没有默认参数构造函数。所以它在 cc 中调用该参数,但你没有在 cc 中定义任何空白参数,所以它说它只有 1 构造函数,你需要创建其他空白构造函数。
dd
继承了 cc
,因此它必须调用 cc
的默认构造函数,目前不存在。
要解决这个问题,只需添加一个不带参数的构造函数
class cc extends bb {
int j,k;
cc(){
//do whatever you want
}
..//rest of code
}