使用 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 继承的主要内容,如果未能解决你的问题,请参考以下文章

java 关于继承中的super() 方法

super 在Java继承中的作用??

Java面向对象_继承思想——super关键字

JAVA继承时this和super关键字

Java中的继承关系,子类不需要写super关键字。也能调用到父类的方法么?

四. Java继承和多态2. Java super关键字