图片来源: http://openarc.edu.lk/wp-content/uploads/2015/11/java-100432255-primary.idge_.jpg
2019-07-26 Java 构造方法的“继承”问题
问题描述:
父类:Animal.java
,子类:Dog.java
,调试入口类:Test.java
。
如果Animal
实现了一个有参数Animal(int age, String name)
的构造方法,Dog
继承Animal
,Dog
并未实现任何方法,在Demo
中new Dog()
会报错,说找不到构造方法。
以下为三个类文件内容
父类:Animal.java
public class Animal {
int age = 10;
String name = "animal";
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
}
子类:Dog.java
// 并未实现任何方法和属性
public class Dog extends Animal {
}
main 方法入口类:Test.java
public class Demo {
public static void main(String string[]) {
Dog dog = new Dog();
System.out.println("dog.age = " + dog.age);
}
}
运行 Test.java
main 方法出现问题
父类 Animal
实现有参数的构造方法,子类 Dog
不实现构造方法,会报错
Error:(3, 8) java: constructor Animal in class inherit.Animal cannot be applied to given types;
required: int,java.lang.String
found: no arguments
reason: actual and formal argument lists differ in length
解析
报错原因:
- 如果父类
Animal
中不实现构造方法,编译器会自动隐式实现一个无参的构造方法Animal(){}
- 如果父类
Animal
中实现了构造方法,编译器不会自动实现无参的构造方法Animal(){}
,所以报错
解决方案,有好多种,具体看自己需求(以下演示两种):
1、在父类 Animal.java
中手动实现无参的构造方法 public Animal(){}
2、在子类 Dog.java
中实现无参数的构造方法 ,并且调用父类中已有的构造方法:
public Dog(){
// 调用父类中已有的构造方法
super(4, '小花');
}