There is no default constructor available in Parent

错误背景

父类Parent

public class Parent {

    Parent(String name){
        System.out.println("我是爸爸,我的名字是 " + name);
    }
}

子类

public class Child extends Parent{

    Child(String name){
        System.out.println("我是儿子,我的名字是" + name);
    }
    
}

这时候就会出现标题所示的错误

There is no default constructor available in Parent

这是为什么呢,错误的原因有以下两个条件:

条件1

java类在不写构造器的时候,会创建一个默认无参的构造器Parent(){}。

如果你写了一个构造器,那默认构造器就不会自动生成了。所以你写了一个带参数的构造器,就不会有默认的无参构造器Parent(){}自动生成。

条件2

基类的构造器总是在导出类的构造过程中被调用,而且按照继承顺序逐渐向上链接,以便使用每个基类的构造器都能得到调用。

当进行继承的时候,我们应该知道基类的一切,并且可以访问基类中任何声明为public和protected的成员。因此当初始化子类 Child c = new Child("狗蛋") 的时候,需要首先初始化其父类并调用其父类构造器。因为是默认的初始化, 因此调用的肯定是无参构造器 Parent p = new Parent();

扫描二维码关注公众号,回复: 9553805 查看本文章

基于上面两个条件,而你又在Parent类中定义了有参构造器,因此不会又无参构造器生成,父类初始化的时候调用不到,肯定就会出错了。

解决方案1:为父类添加无参构造器, 这样就不会产生调用不到的尴尬情况

public class Parent {

    Parent(){
        System.out.println("我是爸爸,但是我没名字");
    }

    Parent(String name){
        System.out.println("我是爸爸,我的名字是 " + name);
    }
}

解决方案2:在子类中添加声明 Super(“父类参数”),这样在初始化父类时候就会默认使用带参数的构造器

public class Child extends Parent{

    Child(String name){
        super("爸爸");
  	//子类构造实现....
    }
}
发布了44 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42784951/article/details/103010693
今日推荐