Java基础 | 综合案例: 学生信息管理 | 04
目录
案例分析
可以分析,上面总共有四个对象,可以把这四个对象抽象为两个类,分别是专业类和学生类。
新建一个工程和包,结构如下
编写并测试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 = "专业信息如下:\n专业名称:" + this.getSubjectName() + "\n专业编号:" + this.getSubjectNo() + "\n专业年限:"
+ 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 = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + 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 = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + this.getStudentAge();
return str;
}
/**
* 学生自我介绍的方法
*
* @param subjectName 专业
* @param subjectLife 学制年限
* @return 自我介绍的信息,包括姓名、学号、性别、方法、专业、学制年限
*/
public String info(String subjectName, int subjectLife) {
String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n专业:" + subjectName + "\n学制年限:"
+ subjectLife;
return str;
}
}
方案2:在方法中添加1一个Subjedct对象作为参数,通过其属性获得相关信息
package com.imooc.model;
public class Student {
...
/**
* 学生自我介绍的方法
*
* @param mySubject 所选Subject的对象
* @return 自我介绍的信息,包括姓名、学号、性别、方法、专业、学制年限
*/
public String info(Subject mySubject) {
String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n专业:" + mySubject.getSubjectName()
+ "\n学制年限:" + 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 = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentNo() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n专业:"
+ this.getStudentSubject().getSubjectName() + "\n学制年限:" + 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中进行初始化。