使用 super 关键字的 Java 继承
Posted
技术标签:
【中文标题】使用 super 关键字的 Java 继承【英文标题】:Java inheritance using super keyword 【发布时间】:2018-05-30 23:03:04 【问题描述】:我在我的程序中使用继承和超级函数,但是当我扩展我的类时,它显示错误消息“'cc'中没有默认构造函数。”。此错误消息是在扩展第一个子类并尝试创建第二个子类之后出现的。这是代码
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);
【问题讨论】:
【参考方案1】:您正在 dd 中扩展类 cc。但是在 dd 中,您没有初始化 cc 拥有的任何东西,这就是错误,因为当 dd 被调用时,它正在搜索其超类的构造函数,而当没有定义构造函数时,java 将无参数构造函数作为默认值。所以它在 cc 中调用了那个参数,但是你没有在 cc 中定义任何空白参数,所以它说它只有 1 构造函数,你需要创建其他空白构造函数。
【讨论】:
【参考方案2】:dd
继承了cc
,所以它必须调用cc
的默认构造函数,目前不存在。
要解决这个问题,只需添加一个不带参数的构造函数
class cc extends bb
int j,k;
cc()
//do whatever you want
..//rest of code
【讨论】:
【参考方案3】:cc
类构造函数是
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");
【讨论】:
【参考方案4】:您的 cc
类有一个带参数的构造函数:
cc(int i, int j, int k)
如果你想从cc
继承,你必须:
dd
构造函数中调用super(int i, int j, int k)
来调用cc
的构造函数,传递构造函数所需的参数。
或者为cc
创建一个不带参数的默认构造函数:cc()
。如果不调用super()
,默认会调用这个构造函数。
【讨论】:
【参考方案5】:问题是 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");
【讨论】:
以上是关于使用 super 关键字的 Java 继承的主要内容,如果未能解决你的问题,请参考以下文章