日期:2014-05-20  浏览次数:20621 次

子类继承父类为什么不行?
老是下面的提示: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[]){

}
}
------解决方案--------------------
楼上正解,调用基类构造器必须是你在导出类构造器中要做的第一件事。