题目要求:
/*定义Student学生类,拥有学号、姓名、性别属性,提供构造函数,以及相应属性的get set函数,提供函数attendClass(String className)表示上课。 定义CollegeStudent大学生类继承自Student类,拥有新增属性专业,提供构造函数,提供新增属性的get和set函数 定义GraduateStudent研究生类继承自CollegeStudent类,拥有新增属性导师,提供构造函数,提供新增属性的get和set函数,main函数中对构造的类进行测试*/
给出主函数:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int no = scan.nextInt();
String name = scan.next();
String sex = scan.next();
Student s = new Student(no, name, sex);
s.print();
no = scan.nextInt();
name = scan.next();
sex = scan.next();
String major = scan.next();
CollegeStudent c = new CollegeStudent(no, name, sex, major);
c.print();
no = scan.nextInt();
name = scan.next();
sex = scan.next();
major = scan.next();
String supervisor = scan.next();
GraduateStudent g = new GraduateStudent(no, name, sex, major, supervisor );
g.print();
g.doResearch();
scan.close();
}
}
实现Student类:
package testall.a01.OJ.zi;
public class Student {
private int number;
private String name;
private String sex;
public Student() {
}
public Student(int number, String name, String sex) {
this.number = number;
this.name = name;
this.sex = sex;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}/*定义Student学生类,拥有学号、姓名、性别属性,提供构造函数,以及相应属性的get set函数,提供函数attendClass(String className)表示上课。
定义CollegeStudent大学生类继承自Student类,拥有新增属性专业,提供构造函数,提供新增属性的get和set函数
定义GraduateStudent研究生类继承自CollegeStudent类,拥有新增属性导师,提供构造函数,提供新增属性的get和set函数,
提供函数doResearch() 表示做研究(打印xx is doing research)。*/
public void attendClass(String className){
System.out.println("上课");
}
public void print(){
System.out.println("no: " + number);
System.out.println("name: " + name);
System.out.println("sex: " + sex);
}
}
实现CollegeStudent类:
package testall.a01.OJ.zi;
/*定义Student学生类,拥有学号、姓名、性别属性,提供构造函数,以及相应属性的get set函数,提供函数attendClass(String className)表示上课。
定义CollegeStudent大学生类继承自Student类,拥有新增属性专业,提供构造函数,提供新增属性的get和set函数
定义GraduateStudent研究生类继承自CollegeStudent类,拥有新增属性导师,提供构造函数,提供新增属性的get和set函数,
提供函数doResearch() 表示做研究(打印xx is doing research)。
main函数中对构造的类进行测试*/
public class CollegeStudent extends Student{
private String zhuanye;
public CollegeStudent() {
}
public CollegeStudent(int number, String name, String sex, String zhuanye) {
super(number, name, sex);
this.zhuanye = zhuanye;
}
public String getZhuanye() {
return zhuanye;
}
public void setZhuanye(String zhuanye) {
this.zhuanye = zhuanye;
}
@Override
public void print(){
System.out.println("no: " + getNumber());
System.out.println("name: " + getName());
System.out.println("sex: " + getSex());
System.out.println("major: " + zhuanye);
}
}
实现GraduateStudent类:
package testall.a01.OJ.zi;
public class GraduateStudent extends CollegeStudent{
/*定义Student学生类,拥有学号、姓名、性别属性,提供构造函数,以及相应属性的get set函数,提供函数attendClass(String className)表示上课。
定义CollegeStudent大学生类继承自Student类,拥有新增属性专业,提供构造函数,提供新增属性的get和set函数
定义GraduateStudent研究生类继承自CollegeStudent类,拥有新增属性导师,提供构造函数,提供新增属性的get和set函数,
提供函数doResearch() 表示做研究(打印xx is doing research)。
main函数中对构造的类进行测试*/
private String teacher;
public GraduateStudent() {
}
public GraduateStudent(int number, String name, String sex, String zhuanye, String teacher) {
super(number, name, sex, zhuanye);
this.teacher = teacher;
}
public String getTeacher() {
return teacher;
}
public void setTeacher(String teacher) {
this.teacher = teacher;
}
public void doResearch(){
System.out.println(getName()+" is doing research");
}
@Override
public void print(){
System.out.println("no: " + getNumber());
System.out.println("name: " + getName());
System.out.println("sex: " + getSex());
System.out.println("major: " + getZhuanye());
System.out.println("supervisor:" + teacher);
}
}
注意子类的有参构造中带有super(.......):
在Java中,如果一个类继承自另一个类,那么子类可以通过调用super
关键字来访问父类的构造方法、成员变量或成员方法。在子类的有参构造方法中调用super(...)
,主要是为了实现以下目的:
-
初始化父类状态:子类在创建对象时,首先需要初始化父类的状态。如果父类有默认的无参构造方法,那么Java会自动调用它。但如果父类没有无参构造方法或者子类需要显式地传递参数给父类的构造方法,那么子类就必须通过
super(...)
来调用父类的有参构造方法。 -
传递参数给父类:有时候,子类需要给父类传递一些参数以初始化父类的某些状态。例如,如果父类有一个成员变量需要在构造时初始化,并且这个成员变量没有默认值或者默认值不满足子类的需求,那么子类就需要通过
super(...)
来传递参数给父类的构造方法。 -
满足Java的规则:Java规定,如果一个类有继承关系,那么子类的构造方法中的第一行必须是调用父类的构造方法,要么是隐式地调用(即不写
super
,Java会自动调用父类的无参构造方法),要么是显式地调用(即使用super(...)
)。如果父类没有无参构造方法且子类没有显式调用父类的构造方法,那么Java编译器会报错。