• 周五. 8月 19th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

Java基础 | 综合案例: 学生信息管理 | 04

admin

11月 28, 2021

案例分析

可以分析,上面总共有四个对象,可以把这四个对象抽象为两个类,分别是专业类和学生类。

新建一个工程和包,结构如下

编写并测试Subject类

Subject类

package com.imooc.model;

/**
 * 专业类
 * 
 * @author rowrycho
 *
 */
public class Subject {
	// 学科名称、学科编号、学制年限
	private String subjectName;
	private String subjectNo;
	private int subjectLife;

	public Subject() {
		super();
	}

	// 构造器 + setter
	public Subject(String subjectName, String subjectNo, int subjectLife) {
		super();
		this.setSubjectName(subjectName);
		this.setSubjectNo(subjectNo);
		this.setSubjectLife(subjectLife);
	}

	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;
	}

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

}

SchoolTest类

package com.imooc.test;
import com.imooc.model.Subject;

public class SchooltTest {
	public static void main(String[] args) {
		Subject sub1 = new Subject("计算机科学与应用","J0001",4);
		System.out.println(sub1.info());
	}
}

编写并测试Student类

Student类

package com.imooc.model;

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

	// 无参构造
	public Student() {
		super();
	}

	// 多参构造 实现对全部属性进行赋值
	// IDE生成,要全部重写为setter
	public Student(String studentNo, String studentName, String studentSex, int studentAge) {
		super();
		this.setStudentNo(studentNo);
		this.setStudentName(studentName);
		this.setStudentSex(studentSex);
		this.setStudentAge(studentAge);
	}

	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 ("男".equals(studentSex) || "女".equals(studentSex))
			this.studentSex = studentSex;
		else
			studentSex = "男";
	}

	public int getStudentAge() {
		return studentAge;
	}

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

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

}

SchoolTest类

package com.imooc.test;
import com.imooc.model.Student;
import com.imooc.model.Subject;

public class SchooltTest {
	public static void main(String[] args) {
		// 测试Subject
		Subject sub1 = new Subject("计算机科学与应用","J0001",4);
		System.out.println(sub1.info());
		
		System.out.println("=======================");
		// 测试Student
		Student stu1=new Student("S01","张三","男",18);
		System.out.println(stu1.info());
	}
}

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

现在要让学生和专业产生联系,如下图,要打印出学生的专业名称和学制年限。

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

package com.imooc.model;

public class Student {
	...

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

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

}

方案2:在方法中添加1一个Subjedct对象作为参数,通过其属性获得相关信息

package com.imooc.model;

public class Student {
	...

	/**
	 * 学生自我介绍的方法
	 * 
	 * @param mySubject 所选Subject的对象
	 * @return 自我介绍的信息,包括姓名、学号、性别、方法、专业、学制年限
	 */
	public String info(Subject mySubject) {
		String str = "学生信息如下:
姓名:" + this.getStudentName() + "
学号:" + this.getStudentNo() + "
性别:"
				+ this.getStudentSex() + "
年龄:" + this.getStudentAge() + "
专业:" + mySubject.getSubjectName()
				+ "
学制年限:" + mySubject.getSubjectLife();
		return str;
	}

}

方案3:在类中添加Subject对象作为属性,通过其属性获得相关信息

package com.imooc.model;

public class Student {
...
	private Subject studentSubject; // Subject对象作为属性


	/**
	 * 获取Subject对象,如果没有实例化,先实例化再返回
	 * 
	 * @return Subject对象信息
	 */
	public Subject getStudentSubject() {
		if (this.studentSubject == null)
			this.studentSubject = new Subject();
		return studentSubject;
	}
...

	/**
	 * 学生自我介绍的方法
	 * 
	 * @return 自我介绍的信息,包括姓名、学号、性别、方法
	 */
	public String info() {
		String str = "学生信息如下:
姓名:" + this.getStudentName() + "
学号:" + this.getStudentNo() + "
性别:"
				+ this.getStudentSex() + "
年龄:" + this.getStudentAge() + "
专业:"
				+ this.getStudentSubject().getSubjectName() + "
学制年限:" + this.getStudentSubject().getSubjectLife();
		return str;
	}

...

}

统计专业有多少个学生进行了报名

package com.imooc.model;

/**
 * 专业类
 * 
 * @author rowrycho
 *
 */
public class Subject {
	// 学科名称、学科编号、学制年限
	private String subjectName;
	private String subjectNo;
	private int subjectLife;
	private Student[] myStudents; // 报名的学生信息
	private int studentNum; // 报名选修的学生人数

...
	/**
	 * 获取选修专业的学生信息,如果未被初始化,则先初始化长度为200
	 * 
	 * @return 保存学生信息的数组
	 */
	public Student[] getMyStudents() {
		if (this.myStudents == null)
			myStudents = new Student[200];
		return myStudents;
	}

...

	/**
	 * 添加一个报名学生信息
	 * 
	 * @param stu 报名学生信息
	 */
	public void addStudent(Student stu) {
		/*
		 * 1. 将学生保存在数组中
		 * 
		 * 2. 将学生个数保存到studentNum
		 */
		for (int i = 0; i < this.getMyStudents().length; i++) {
			if (this.getMyStudents()[i] == null) {
				this.getMyStudents()[i] = stu;
				this.studentNum++;
				break;
			}
		}
	}

}

package com.imooc.test;

import com.imooc.model.Student;
import com.imooc.model.Subject;

public class SchooltTest {
	public static void main(String[] args) {
	...
		// 测试指定专业中到底有多少学生报名
		sub1.addStudent(stu1);
		sub1.addStudent(stu2);
		sub1.addStudent(stu3);
		System.out.println(sub1.getSubjectName() + "报名人数:" + sub1.getStudentNum());

	}
}

像数组作为属性,是在getter中进行初始化还是在定义的时候初始化?其实这二者都是可以的,但是更加推荐在getter中进行初始化。

  • 为什么添加学生的操作不在构造方法或者set方法中呢?

首先构造方法只会在new一个对象的时候启动,这个方案直接pass。

如果是使用setter,那么每次都要传入的是一个数组对象,不能进行学生一个一个的添加,这样也是不方便的。

优化:一个方法完成学生和专业的双向关联

package com.imooc.model;

/**
 * 专业类
 * 
 * @author rowrycho
 *
 */
public class Subject {
	...

	/**
	 * 添加一个报名学生信息
	 * 
	 * @param stu 报名学生信息
	 */
	public void addStudent(Student stu) {
		/*
		 * 1. 将学生保存在数组中
		 * 
		 * 2. 将学生个数保存到studentNum
		 */
		for (int i = 0; i < this.getMyStudents().length; i++) {
			if (this.getMyStudents()[i] == null) {
				// 实现Subject对象和Student对象的双向关联
				stu.setStudentSubject(this);
				this.getMyStudents()[i] = stu;
				this.studentNum++;
				break;
			}
		}
	}

}

小结

编写代码的规范

* 用好文档注释 文档注释是最后用于生成帮助文档的!这个需要好好的写。
* 类 和 测试类 分别存放在两个不同的包中
* 构造方法 & setter 
* 类名 开头大写、变量&方法名 开头小写、包名 全部小写
* 写一个功能 就测试一次.. 

如何判断两个字符串是否相等?

字符串判断是否相等 别再使用==!
str.equals()

如何让两个类相关联?

1. 直接在方法中添加参数
2. 将参数封装一个对象,直接给方法传递这个对象
3. 将对象作为属性

引用类型的getter

引用类型:类 接口 数组

引用类型默认值为null 那么这是不好的
所以在getter里要判断是否为null

	/**
	 * 获取选修专业的学生信息,如果未被初始化,则先初始化长度为200
	 * 
	 * @return 保存学生信息的数组
	 */
	public Student[] getMyStudents() {
		if (this.myStudents == null)
			myStudents = new Student[200];
		return myStudents;
	}

数组作为属性,什么时候进行初始化?

像数组作为属性,是在getter中进行初始化还是在定义的时候初始化?其实这二者都是可以的,但是更加推荐在getter中进行初始化。

发表回复

您的电子邮箱地址不会被公开。