问题描述
- 如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错。
-
class Person {
private String name;
private int age;public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName(){ return name; } public int getAge(){ return age; }
}
class Student extends Person {
private String school;public String getSchool() { return school; } public void setSchool(String school) { this.school =school; }
}
public class Test {
public static void main(String args[]){
Student student = new Student();
student.setName("John");
student.setAge(18);
student.setSchool("SCH");
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getSchool());
}
}
这段代码有问题吗?
根据”如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错。”这句话,此段代码中,子类Student没有显示调用父类构造方法,而父类Person中又没有无参数的构造方法,编译应该出错啊???
解决方案
Java是这样的,如果你根本没有定义无参数构造函数,那么编译器会产生一个空的构造函数。
换言之:
class A
{
}
等价
class A
{
public A() { } //编译器自动加上
}
但是
class A
{
public A(int i) { }
}
就没有那个默认的构造函数了。
如果你定义了有参数构造函数,那么编译器不会产生无参数构造函数。
如果你的基类没有无参数构造函数,派生类必须显式调用基类的构造函数。
解决方案二:
因为你的派生类没有写构造函数,这种情况是允许的。
解决方案三:
没有写构造函数,不是有个默认的无参构造函数吗?
解决方案四:
你的类中,没有构造函数,java编译器为你自动生成了一个无参数的构造函数。