如何用程序描述不同的学生,抽取所有学生的公共属性定义为学生的父类?

这个问题怎么解决,思考了好几天了,都没想出一个好的解决方案 。用的软件是elipse。

定义Student学生类,拥有学号、姓名、性别属性,提供构造函数,以及相应属性的get set函数,提供函数attendClass(String className)表示上课。
定义CollegeStudent大学生类继承自Student类,拥有新增属性专业,提供构造函数,提供新增属性的get和set函数
定义GraduateStudent研究生类继承自CollegeStudent类,拥有新增属性导师,提供构造函数,提供新增属性的get和set函数,提供函数doResearch() 表示做研究(打印xx is doing research)。

class Student{
    private int no;
    private String sex;
    private String name;
    
    public Student(int no,String name,String sex) {
        this.no=no;
        this.name=name;
        this.sex=sex;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getSex() {
        return sex;
    }
    
    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void print()
    {
        System.out.println("no: "+no);
        System.out.println("name: "+name);
        System.out.println("sex: "+sex);
    }
}
class CollegeStudent extends Student {
    private String major;
    
    public CollegeStudent(int no, String name,String sex,String major) {
        super(no,name,sex);
        this.major = major;
    }
    public String getMajor() {
        return major;
    }
    
    public void setMajor(String major) {
        this.major = major;
    }
    
    public void print() {
        super.print();
        System.out.println("major: "+major);
    }
}

class GraduateStudent extends CollegeStudent{
    private String teacher;
    
    public GraduateStudent(int no,String name,String sex,String major,String teacher){
        super(no,name,sex,major);
        this.teacher = teacher;
    }
    
    public String getTeacher() {
        return teacher;
    }
    
    public void setTeacher(String teacher) {
        this.teacher = teacher;
    }
    
    public void print() {
        super.print();
        System.out.println("supervisor: "+teacher);
    }
    
    public void doResearch() {
        System.out.println(this.getName()+" is doing research");
    }
}
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(); 
    }
}

赞思考! 请你分享你目前的思路吧!

这个看你怎么思考的。你可以把学生的父类看成人,人的属性就有姓名、年龄、身高、性别.....然后学生有自己的属性 学号、年级、学历...

这个问题其实考察更多的是如何理解继承和抽象关系。
学生是一个庞大的、抽象的组织,但学生之所以被称为学生,是因为他们具有公共部分,所有满足该公共部分的群体我们都称之为学生。
“所有处于学习的人都应当被称为学生”,如果根据这个条件出发,那么我们可以定义一个抽象类abstract Student,内部应当包含一个学习的抽象方法abstract study(),(如果有更上层的基类例如Person,Student应当继承,并且将人类有的属性例如姓名,年龄,性别等全部挂载到Person类身上,而非Student类身上,Student类应当有属于自己独有的属性例如班级、学号等)。
类似地,学生既然是抽象的,那总有实现者,实现者可以是小学生,初中生,高中生,大学生等,当然如果考虑得当的话,这些小学生,初中生等也可以被认为是抽象类。
具体应当谁是真正的实现者,需要看业务需要,但实现者永远是最精确的、细分到极致的类。当然这不是强制要求,但这种解耦思想有利于后期代码的可维护性和可扩展性。