9 回答
dreamertn9527
TA贡献3条经验 获得超4个赞
java中每个类必须有一个构造函数,如果没有显示的声明构造函数,那么编译器会自动加一个无参的构造函数。当显示定义了带参数的构造函数之后,而没有显示的定义无参构造函数,那么这个类就没有无参构造函数了。
子类继承父类,必须在子类的构造函数中调用父类的构造函数,如果子类的构造函数中,没有显示的调用父类的构造函数,那么会自动调用父类的无参数构造函数,如果父类没有无参数构造函数,那么子类中必须显示的调用父类的构造函数(使用super关键字即可),而且必须是在构造方法的第一个语句 中进行调用。
PS:现在说说你的代码的问题,父类Animal没有显示的定义无参构造函数,所以只有有参构造函数,子类必须调用父类的构造方法(即父类的有参构造方法),用来初始化父类。(子类在执行过程中,先执行父类,所以必须初始化父类的构造器,避免出现错误)。
// 父类Animal public class Animal { private String color; private String size; // 只定义了有参构造函数,未显示定义无参构造函数 public Animal(String color, String size){ this.color = color; this.size = size; } } // 子类Dog继承父类Animal class Dog extends Animal(){ // 子类继承父类,需要调用父类的构造方法,使用super关键字即可 public Dog(String color, String size, String test) { super(color, size); // 必须放在第一个构造函数第一行 } }
下面是你想达到的效果:
public class Animal { private String color; private String size; // 显示定义无参构造函数 public Animal(){} public Animal(String color, String size){ this.color = color; this.size = size; } } class Cat extends Animal{ public Cat(String color, String size, String test){ super(); // 其实也是调用了父类的无参构造方法,编译器默认调用而已,也可以不写该super() } }
Goddess_chkx
TA贡献15条经验 获得超30个赞
子类不满意父类的构造器,想重新写一个构造器,但是必须要调用父类的构造器,为什么必须要调用父类的构造器,是不是你后面说的要先创建父类对象,调用父类的构造器,然后再创建子类对象,调用子类的构造器。那它干嘛不去父类里调,要在子类里再写一遍,还有既然是先调用父类构造器,再调用子类构造器,为什么我图片中打印出来只有子类(我还以为是先打印父类再打印子类,不解)
添加回答
举报
0/150
提交
取消