欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java项目笔记 Implicit super constructor is undefined for default constructor. Must define an explicit c

程序员文章站 2024-03-02 18:48:52
...
class People{ 
    private String name;  
    public People(String name) {} 
}
class Man extends People{}

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

class Man extends People{
    public Man (String name) {
        super(name);
    }
}

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

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

public People() { }

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

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

public Man(){
   super();  
}

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

所以应该这样解决

父类加入无参的构造方法

public People(){}

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

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

默认构造方法

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

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

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

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

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

结论:尽量在一个类中(尤其是父类)
多采用不同参数的构造方法,有参的,无参的都要包含,就可以在项目开发达到规避风险的目的