在学习java的父类、子类的用法时,突然提示了这个一个异常
there is no default constructor available in ...的错误,看起来挺诡异的,为什么会出现这个错误提示呢?我们来看看
有一个父类Animal
该父类有一个有参构造方法 public Animal(String myName, int myId)
我们来看看继承的子类
在public Penguin(String myName, int myId)处出现红线提示
为什么会出现这个提示呢,错误很明显 constructor,构造函数错误
子类继承了父类,但是父类没有默认的构造函数(Animal父类没有无参构造函数)(当类显示定义带参构造函数,而没有显示定义无参的情况,无参构造消失)
继承了父类,那么子类就是父类的延伸。实例化的时候是父类先实例化但是子类中没有调用父类的构造方法 (有默认构造函数的就不用担心这个问题,会自动调用默认构造方法 因为不需要给参数)
所以只要在子类的构造方法中显示的调用父类的有参构造 super(args)就行啦,所以这个问题这么修改下就好了
运行下,果然可以了。
下面,我们再聊下父类/子类的有参构造方法,对应的类的实例化
前提条件:
父类有参构造方法,也有非构造方法
子类有参构造方法,也有非构造方法
我们在子类中去操作以下步骤:
- 父类 xxx = new 父类 xxx;
- 父类 xxx = new 子类 xxx;
- 子类 xxx = new 子类 xxx;
- 子类 xxx = new 父类 xxx;
第4个最简单,直接报错了,不能子类实例化父类
- 可以调用父类的有参构造方法,可以调用父类里的非构造方法,不能调用子类的有参构造方法,不能调用子类的非有参构造方法
- 可以调用父类的有参构造方法,可以调用父类里的非构造方法,可以调用子类的有参构造方法,不能调用子类的非有参构造方法
- 可以调用父类的有参构造方法,可以调用父类里的非构造方法,可以调用子类的有参构造方法,可以调用子类的非有参构造方法
我们是怎么知道是否可以调用呢,其实直接写就可以了,是否能调用,编译器就会告诉你了。
下面多说一些,如果B继承于A, C继承与B,那么C可以调用A类里的有参构造方法和非构造方法么?大家可以下去试下