匿名用户
1级
2013-08-20 回答
Person()方法是用来创建实例的构造方法,例如你要创建一个Person类的实例就需要new Person(),这里的Person()就是Person类的构造方法,构造方法没有返回值(注意是没有返回值 不是返回void),并且名称必与类名一致。
因为你重载了一个构造方法Person(String n, char s),系统就不会再为你提供无参的构造方法了,也就是说你只能通过
new Person(String n, char s) 来实例化对象,而调用new Person()则会报错,因为找不到该方法。所以你要再写一个无参的构造方法Person(),这样你就可以通过new Person()和new Person(String n, char s)两种方式来创建对象了。
追问:
那为什么Person(){};在这段代码之中不能删除呢?
追答:
当一个类被另一个类继承时,
实例化子类必先实例化父类,
若不指定子类创建实例时会自动调用super()方法,也就是父类的无参构造方法。
所以你要想删除父类中的无参构造方法只有通过两种方式:
1.删除掉子类中的所有调用super()的构造方法,未声明的就是默认调用,例如你的无参构造方法
2.在子类的构造方法中声明调用父类的有参构造方法例如Student中的super(n,s)
但是一般都要写一个无参方法 以为很多插件例如Hibernate 他就会去调用你的无参方法创建实例,如果你的类中没有无参方法Hibernate 就无法帮你创建实例
class Person {
String name;
char sex;
Person(String n, char s) {
name = n;
sex = s;
}
void show() {
System.out.println("nameis" + name + ",sexis" + sex);
}
}
class Student extends Person {
int number;
Student(String n, char s, int num) {
super(n, s); //删除子类中的无参构造方法 并指定该子类的构造方法去调用父类中指定的构造方法,让JVM不去调用无参方法
this.number = num;
}
void show() {
System.out.println("nameis" + name + ",sexis" + sex + ",numberis"
+ number);
}
}
class Pupil extends Student {
double hcScore;
Pupil(String n, char s, int num, double hcs) {
super(n, s, num); //同上
hcScore = hcs;
}
void show() {
System.out.println("nameis" + name + ",sexis" + sex + ",numberis"
+ number + ",Scoreis" + hcScore);
}
}