Implicit super constructor is undefined for default constructor. Must define an explicit constructor

代码示例如下:

class Animal { 
    private String name;  
    public Animal(String name) {} 
}
class Penguin extends Animal{}

编辑器会提示 Implicit super constructor is undefined for default constructor. Must define an explicit constructor ( 隐含的父类构造方法没有为默认的构造方法定义,必须定义一个明确的构造方法) , 使用编辑器提示会自动生成如下代码:

class Penguin extends Animal{
    public Penguin(String name) {
        super(name);
    }
}

分析错误原因,主要从两个方面:默认构造方法生成子类构造方法默认调用父类无参的构造方法

默认的构造方法:在Java中如果一个类没有定义构造方法,编译器会默认帮忙生成一个无参的构造方法,如果已经定义了构造方法那么就不会再生成无参的构造方法,生成的无参构造方法貌似下面:

1 public Penguin(){}

但是真实的情况并不是现在看到的这样。为什么不是这样,是因为在Java的继承中,要求子类的构造方法必须调用父类的构造方法,如果子类没有显示的调用父类的构造方法

那么编译器就会隐含调用父类的无参构造方法,这样就可以解释为什么报错及修复的方法。在之前的例子中编译器默认生成的构造方法如下:

public Penguin(){
   super();  
}

这样就清楚了,编译器生成了一个无参的构造方法,同时调用了父类的无参构造方法调用方式:super() ,又因为父类定义了有参的构造方法所以就不会有无参的构造方法,导致报错。

修改方案:

父类加入无参的构造方法

public Animal(){}

子类定义自己的无参或有参的构造方法,同时用super关键字显示调用父类的有参构造方法,因为父类没有无参的构造方法(Java默认调用父类无参的构造方法)

public Penguin(){
    super("defaultName");
}
  或
public Penguin(String myName) {
   super(myName);
}

去掉父类的自定义构造方法使用默认的构造方法


默认构造方法

在java语言中,每个类至少有一个构造方法。如果程序中没有显式定义任何构造方法,

那么java语言将自动提供一个隐含的默认构造方法。只要程序中已经显式定义了构造方法。

那么java语言将不再提供隐含的默认构造方法。

子类为什么必须调用父类的构造方法

因为子类继承父类,会继承到父类的特性和行为,所以子类在初始化时必须要看父类是如何对自己的数据进行初始化的。子类调用父类的构造方法有来初始化父类私有的变量及做其它额外的工作。所以子类在进行对象初始化时,先调用父类的构造函数

猜你喜欢

转载自www.cnblogs.com/wangliv/p/Java.html