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