子类继承父类为什么不行?
老是下面的提示:implicit super constructor Person() is undefined for default constructor .Must define an explicit constructor.
源程序如下:(我用的是eclipse编译器,还有我想问一下java的开发工具选择哪一个比较好用.)
package test;
class Person
{
protected String name;
protected int age;
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
public void print()
{
System.out.println( "Name: "+name+ "\nAge: "+age);
}
}
class Student extends Person
{
}
class Test {
public static void main(String args[])
{
}
}
------解决方案--------------------你的class Test是内部类了,把它写出去就可以了.
------解决方案--------------------提示说 : 需要给person类定义一个 默认构造器
public Person()
{
}
------解决方案--------------------父类 也就是Person 类没有定义默认的构造函数。
------解决方案--------------------要么在Person中定义一个默认的构造函数,要么在Student的构造函数里super一下Person的构造函数
------解决方案--------------------Study chapter 2, section 7 of this book:
SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055)
byKathy SierraandBert Bates
McGraw-Hill/Osborne 2006 (864 pages)
ISBN:0072253606
------解决方案--------------------加个无参数的构造函数,因为在继承的时候子类会自动调用父类的无参数的构造函数,如过你没有写其它的构造函数,编译器会自动为你加上,如果你写了编译器就不在加了,需要你自己写了
public Person()
{
}
就可以了
------解决方案--------------------因为你的父类已经定义了一个有参的构造器,此时编译器不会为你调用默认的构造器,当子类继承时,必须在自己的构造函数显示调用父类的构造器,自己才能确保子类在初始化前父类会被实例化,如果你父类中有无参的构造器,字类就不会强制要求调用,即你写的那个就可以通过,编译器会默认帮你调用父类的构造器。
按原来的思路,必须该成下面的:
class Person {
protected String name;
protected int age;
////你已经定义了自动的构造函数,此时编译器不会为你创建默认的构造函数
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public void print() {
System.out.println( "Name: "+name+ "\nAge: "+age);
}
}
//由于父类的构造函数是有掺的,所以编译不会为你自动调用默认的构造函数,此时,子类在自
//己的构造函数中必须显示的调用父类的构造函数
class Student extends Person {
public Student(){ //子类构造函数
//super(); //不行,因为你的父类没有无参的构造函数
super( "a ",1); //显示调用父类的构造函数,而且必须是第一行调用
}
}
class Test {
public static void main(String args[]){
}
}
------解决方案--------------------楼上正解,调用基类构造器必须是你在导出类构造器中要做的第一件事。