【从零开始的Java开发】1-3-3 综合案例:学生信息管理


在这里插入图片描述

编写并测试Subject类

新建一个schoolProj工程,在src里建两个包package,我们的代码就要在这里写。
学科类在model中。
在这里插入图片描述
Subject类代码:

package com.model;

public class Subject {

	// 成员属性:学科名称、学科编号、学制年限
	private String subjectName;
	private String subjectNo;
	private int subjectlife;

	// 封装:对应getter和setter方法
	public String getSubjectName() {
		return subjectName;
	}

	public void setSubjectName(String subjectName) {
		this.subjectName = subjectName;
	}

	public String getSubjectNo() {
		return subjectNo;
	}

	public void setSubjectNo(String subjectNo) {
		this.subjectNo = subjectNo;
	}

	public int getSubjectlife() {
		return subjectlife;
	}

	// 学制年限要大于0
	public void setSubjectlife(int subjectlife) {
		if (subjectlife <= 0)
			return;
		this.subjectlife = subjectlife;
	}

	// 无参构造方法
	public Subject() {

	}

	// 带参构造方法
	public Subject(String subjectName, String subjectNo, int subjectlife) {
		this.setSubjectName(subjectName);
		this.setSubjectNo(subjectNo);
		this.setSubjectlife(subjectlife);
	}

	/**
	 * 专业介绍的方法
	 * 
	 * @return专业介绍的相关信息:名称、编号、年限
	 */
	public String info() {
		String str = "专业信息如下:\n专业名称:" + this.getSubjectName() + "\n专业名称:" + this.getSubjectNo() + "\n专业年限:"
				+ this.getSubjectlife();
		return str;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

测试类代码:

package com.test;
import com.model.Subject;
public class SchoolTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//测试Subject
		
		Subject sub1=new Subject("计算机科学与技术","J0001",4);
		System.out.println(sub1.info());	
	}

}

输出:

专业名称:计算机科学与技术
专业名称:J0001
专业年限:4

编写并测试Student类

Student类:

package com.model;

public class Student {
	// 成员属性:学号、姓名、性别、年龄
	private String studentNo;
	private String studentName;
	private String studentSex;
	private int studentAge;

	// 封装:getter和setter函数
	public String getStudentNo() {
		return studentNo;
	}

	public void setStudentNo(String StudentNo) {
		this.studentNo = StudentNo;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public String getStudentSex() {
		return studentSex;
	}

	/**
	 * 限制性别为男或女,反之强制为男
	 * 
	 * @param studentSex 输入的性别
	 */
	public void setStudentSex(String studentSex) {
		if (studentSex == "男" || studentSex == "女")
			this.studentSex = studentSex;
		else
			this.studentSex = "男";
	}

	public int getStudentAge() {
		return studentAge;
	}

	/**
	 * 给年龄赋值,限定必须在10-100之间,反之赋值18
	 * 
	 * @param studentAge 传入的年龄
	 */
	public void setStudentAge(int studentAge) {
		if (studentAge < 10 || studentAge > 100)
			this.studentAge = 18;
		else
			this.studentAge = studentAge;
	}

	// 无参构造方法
	public Student() {

	}

	// 带参构造方法
	public Student(String studentNo, String studentName, String studentSex, int studentAge) {
		this.setStudentNo(studentNo);
		this.setStudentName(studentName);
		this.setStudentSex(studentSex);
		this.setStudentAge(studentAge);
	}

	/**
	 * 学生自我介绍的方法
	 * 
	 * @return 自我介绍的信息,包括姓名,学号,性别,年龄
	 */
	public String introduction() {
		String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
				+ this.getStudentSex() + "\n年龄:" + this.getStudentAge();
		return str;
	}

}

测试类语句:

Student stu1=new Student("S01","张三","男",19);
System.out.println(stu1.introduction());

输出:

学生信息如下:
姓名:张三
学号:S01
性别:男
年龄:19

测试类语句:

Student stu1=new Student("S01","张三","A",200);

输出:

学生信息如下:
姓名:张三
学号:S01
性别:男
年龄:18

说明setter中的限制有效。

通过方法实现学生与专业关联

方法一

在方法中添加两个参数,分别表示专业名称和学制年限。

/**
	 * 学生自我介绍的方法
	 * 
	 * @param subjectName
	 * @param subjectlife
	 * @return 自我介绍的信息,包括姓名,学号,性别,年龄,所在专业,学制年限
	 */
	public String introduction(String subjectName, int subjectlife) {
		String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
				+ this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n所报专业名称:" + subjectName + "\n学制年限:"
				+ subjectlife;
		return str;
	}

测试类语句:

Student stu1=new Student("S01","张三","A",200);
System.out.println(stu1.introduction("计算机科学与技术",4));

输出:

学生信息如下:
姓名:张三
学号:S01
性别:男
年龄:18
所报专业名称:计算机科学与技术
学制年限:4

方案二

传入一个学科对象。
注意,这里传入的是对象的引用

//传入一个对象
	public String introduction(Subject mySubject) {
		String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
				+ this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n所报专业名称:" + mySubject.getSubjectName()
				+ "\n学制年限:" + mySubject.getSubjectlife();
		return str;
	}

测试类语句:

Subject sub1=new Subject("计算机科学与技术","J0001",4);		
Student stu1=new Student("S01","张三","男",18);
System.out.println(stu1.introduction(sub1));

输出:

学生信息如下:
姓名:张三
学号:S01
性别:男
年龄:18
所报专业名称:计算机科学与技术
学制年限:4

方案三

前两个方案都是把专业信息当作参数传入的,这里我们把专业信息当作学生的成员属性

代码:

public class Student {
	// 成员属性:学号、姓名、性别、年龄、专业
	private String studentNo;
	private String studentName;
	private String studentSex;
	private int studentAge;
	private Subject studentSubject;
	
	// 封装:getter和setter函数
	public String getStudentNo() {
		return studentNo;
	}

	public void setStudentNo(String StudentNo) {
		this.studentNo = StudentNo;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public String getStudentSex() {
		return studentSex;
	}
	
	
	/**
	 * 限制性别为男或女,反之强制为男
	 * 
	 * @param studentSex 输入的性别
	 */
	public void setStudentSex(String studentSex) {
		if (studentSex == "男" || studentSex == "女")
			this.studentSex = studentSex;
		else
			this.studentSex = "男";
	}

	public int getStudentAge() {
		return studentAge;
	}

	/**
	 * 给年龄赋值,限定必须在10-100之间,反之赋值18
	 * 
	 * @param studentAge 传入的年龄
	 */
	public void setStudentAge(int studentAge) {
		if (studentAge < 10 || studentAge > 100)
			this.studentAge = 18;
		else
			this.studentAge = studentAge;
	}
	
	/**
	 * 获取专业对象,如果没有实例化,则实例化后再返回
	 * @return 专业对象信息
	 */
	public Subject getStudentSubject() {
		if(this.studentSubject==null)
			this.studentSubject=new Subject();
		return studentSubject;
	}

	public void setStudentSubject(Subject studentSubject) {
		this.studentSubject = studentSubject;
	}

	// 无参构造方法
	public Student() {

	}

	// 带参构造方法
	public Student(String studentNo, String studentName, String studentSex, int studentAge,Subject studentSubject) {
		this.setStudentNo(studentNo);
		this.setStudentName(studentName);
		this.setStudentSex(studentSex);
		this.setStudentAge(studentAge);
		this.setStudentSubject(studentSubject);
	}

	/**
	 * 学生自我介绍的方法
	 * 
	 * @return 自我介绍的信息,包括姓名,学号,性别,年龄,所在专业,学制年限
	 */
	public String introduction() {
		String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
				+ this.getStudentSex() + "\n年龄:" + this.getStudentAge()+ "\n所报专业名称:" + this.getStudentSubject().getSubjectName() + "\n学制年限:"
						+ this.getStudentSubject().getSubjectlife();
		//这里要注意调用学科信息的调用方法:先调用学科对象,再调用学科对象get方法
		return str;
	}

测试类语句:

Subject sub1=new Subject("计算机科学与技术","J0001",4);		
Student stu1=new Student("S01","张三","男",18,sub1);
System.out.println(stu1.introduction());

输出:

学生信息如下:
姓名:张三
学号:S01
性别:男
年龄:18
所报专业名称:计算机科学与技术
学制年限:4

方案分析

方案一:传入需要的参数
方案二:传入对象
方案三:在学生类中加入成员属性:学科类属性,通过学生类的成员对象的get方法得到需要的参数

分析:
方案一——容易理解,但参数列表长
方案二——更加简单,获取参数方便
方案三——关联性更强

数据类型

在这里插入图片描述

新增需求

想知道 计算机科学与技术 这个学科有多少人报名。

完成学生信息存储

成员属性代码:

// 成员属性:学科名称、学科编号、学制年限、报名选修的学生信息、保存报名选修的学生个数
	private String subjectName;
	private String subjectNo;
	private int subjectlife;
	private Student[] myStudents;
	private int studentNum;

新增的getter和setter代码:

/**
	 * 获取选修专业的学生信息,如果数组未被初始化,则先给它初始化200,再返回
	 * @return 保存学生信息的数组
	 */
	public Student[] getMyStudent() {
		if(this.myStudents==null)
			this.myStudents=new Student[200];
		return myStudents;
	}
	
	public void setMyStudent(Student[] myStudents) {
		this.myStudents=myStudents;
	}
	

	public int getStudentNum() {
		return studentNum;
	}

	public void setStudentNum(int studentNum) {
		this.studentNum = studentNum;
	}

新增的构造方法:

// 带参构造方法:实现对学科名称、编号、学制年限、报名选修的学生数组的赋值
		public Subject(String subjectName, String subjectNo, int subjectlife,Student[] myStudents) {
			this.setSubjectName(subjectName);
			this.setSubjectNo(subjectNo);
			this.setSubjectlife(subjectlife);
			this.setMyStudent(myStudents);
		}

编写方法完成学生统计功能

方法如下:

public void addStudent(Student stu) {
		/*
		 * 1、将学生保存到数组中
		 * 2、将学生个数保存在StudentNum中
		 */
			
		for(int i=0;i<this.getMyStudent().length;i++) {
			if(this.getMyStudent()[i]==null) {
				stu.setStudentSubject(this);
				this.getMyStudent()[i]=stu;
				this.studentNum=i+1;
				return;
			}
		}	
	}

测试类内容如下:

Subject sub1=new Subject("计算机科学与技术","J0001",4);		
Student stu1=new Student("S01","张三","男",18,sub1);
Student stu2=new Student("S02","李四","女",18,sub1);
Student stu3=new Student("S03","王五","男",19,sub1);
sub1.addStudent(stu1);
sub1.addStudent(stu2);
sub1.addStudent(stu3);
System.out.println(sub1.getStudentNum());

输出:3

一些声明与实例化

两种都可以,但第一种效率更高——用的时候再开空间。
在这里插入图片描述

总体代码

Subject 类

package com.model;

public class Subject {

	// 成员属性:学科名称、学科编号、学制年限、报名选修的学生信息、保存报名选修的学生个数
	private String subjectName;
	private String subjectNo;
	private int subjectlife;
	private Student[] myStudents;
	private int studentNum;

	// 封装:对应getter和setter方法
	public String getSubjectName() {
		return subjectName;
	}

	public void setSubjectName(String subjectName) {
		this.subjectName = subjectName;
	}

	public String getSubjectNo() {
		return subjectNo;
	}

	public void setSubjectNo(String subjectNo) {
		this.subjectNo = subjectNo;
	}

	public int getSubjectlife() {
		return subjectlife;
	}

	// 学制年限要大于0
	public void setSubjectlife(int subjectlife) {
		if (subjectlife <= 0)
			return;
		this.subjectlife = subjectlife;
	}
	
	
	/**
	 * 获取选修专业的学生信息,如果数组未被初始化,则先给它初始化200,再返回
	 * @return 保存学生信息的数组
	 */
	public Student[] getMyStudent() {
		if(this.myStudents==null)
			this.myStudents=new Student[200];
		return myStudents;
	}
	
	public void setMyStudent(Student[] myStudents) {
		this.myStudents=myStudents;
	}
	

	public int getStudentNum() {
		return studentNum;
	}

	public void setStudentNum(int studentNum) {
		this.studentNum = studentNum;
	}

	// 无参构造方法
	public Subject() {

	}

	// 带参构造方法:实现对学科名称、编号、学制年限的赋值
	public Subject(String subjectName, String subjectNo, int subjectlife) {
		this.setSubjectName(subjectName);
		this.setSubjectNo(subjectNo);
		this.setSubjectlife(subjectlife);
	}
	
	// 带参构造方法:实现对学科名称、编号、学制年限、报名选修的学生数组的赋值
		public Subject(String subjectName, String subjectNo, int subjectlife,Student[] myStudents) {
			this.setSubjectName(subjectName);
			this.setSubjectNo(subjectNo);
			this.setSubjectlife(subjectlife);
			this.setMyStudent(myStudents);
		}

	/**
	 * 专业介绍的方法
	 * 
	 * @return专业介绍的相关信息:名称、编号、年限
	 */
	public String info() {
		String str = "专业信息如下:\n专业名称:" + this.getSubjectName() + "\n专业名称:" + this.getSubjectNo() + "\n专业年限:"
				+ this.getSubjectlife();
		return str;
	}
	
	public void addStudent(Student stu) {
		/*
		 * 1、将学生保存到数组中
		 * 2、将学生个数保存在StudentNum中
		 */
			
		for(int i=0;i<this.getMyStudent().length;i++) {
			if(this.getMyStudent()[i]==null) {
				stu.setStudentSubject(this);
				this.getMyStudent()[i]=stu;
				this.studentNum=i+1;
				return;
			}
		}	
	}
}

Student类

package com.model;

public class Student {
	// 成员属性:学号、姓名、性别、年龄、专业
	private String studentNo;
	private String studentName;
	private String studentSex;
	private int studentAge;
	private Subject studentSubject;
	
	// 封装:getter和setter函数
	public String getStudentNo() {
		return studentNo;
	}

	public void setStudentNo(String StudentNo) {
		this.studentNo = StudentNo;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public String getStudentSex() {
		return studentSex;
	}
	
	
	/**
	 * 限制性别为男或女,反之强制为男
	 * 
	 * @param studentSex 输入的性别
	 */
	public void setStudentSex(String studentSex) {
		if (studentSex == "男" || studentSex == "女")
			this.studentSex = studentSex;
		else
			this.studentSex = "男";
	}

	public int getStudentAge() {
		return studentAge;
	}

	/**
	 * 给年龄赋值,限定必须在10-100之间,反之赋值18
	 * 
	 * @param studentAge 传入的年龄
	 */
	public void setStudentAge(int studentAge) {
		if (studentAge < 10 || studentAge > 100)
			this.studentAge = 18;
		else
			this.studentAge = studentAge;
	}
	
	/**
	 * 获取专业对象,如果没有实例化,则实例化后再返回
	 * @return 专业对象信息
	 */
	public Subject getStudentSubject() {
		if(this.studentSubject==null)
			this.studentSubject=new Subject();
		return studentSubject;
	}

	public void setStudentSubject(Subject studentSubject) {
		this.studentSubject = studentSubject;
	}

	// 无参构造方法
	public Student() {

	}

	// 带参构造方法
	public Student(String studentNo, String studentName, String studentSex, int studentAge,Subject studentSubject) {
		this.setStudentNo(studentNo);
		this.setStudentName(studentName);
		this.setStudentSex(studentSex);
		this.setStudentAge(studentAge);
		this.setStudentSubject(studentSubject);
	}

	/**
	 * 学生自我介绍的方法
	 * 
	 * @return 自我介绍的信息,包括姓名,学号,性别,年龄,所在专业,学制年限
	 */
	public String introduction() {
		String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
				+ this.getStudentSex() + "\n年龄:" + this.getStudentAge()+ "\n所报专业名称:" + this.getStudentSubject().getSubjectName() + "\n学制年限:"
						+ this.getStudentSubject().getSubjectlife();
		return str;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karshey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值