Studens类
package com.jachie.entiy;
/**
*
* @author 哒哒哒
*/
public class Students {
private String stuName; // 学生姓名
private int stuId;
private String sex;
private int age;
private Subject sb;
/**
* 4参构造方法
* @param stuName
* @param stuId
* @param sex
* @param age
*/
public Students( String stuName, int stuId, String sex, int age) {
this.setStuName(stuName);
this.setStuId(stuId);
this.setSex(sex);
this.setAge(age);
}
/**
* 获取学生姓名
* @return
*/
public String getStuName() {
return stuName;
}
/**
* 设置学生姓名
* @param stuName
*/
public void setStuName(String stuName) {
this.stuName = stuName;
}
/**
* 获取学号
* @return
*/
public int getStuId() {
return stuId;
}
/**
* 设置学号
* @param stuId
*/
public void setStuId(int stuId) {
this.stuId = stuId;
}
/**
* 获取性别
* @return
*/
public String getSex() {
return sex;
}
/**
* 设置性别,增加验证,默认性别 “男”
* @param sex
*/
public void setSex(String sex) {
if(sex != "男" || sex != "女")
this.sex = "男";
else
this.sex = sex;
}
/**
* 获取年龄
* @return
*/
public int getAge() {
return age;
}
/**
* 设置年龄,并且限制年龄范围,默认年龄18
* @param age
*/
public void setAge(int age) {
if(age <= 0 || age >= 200)
this.age = 18;
else
this.age = age;
}
/**
* 无参构造
*/
public Students() {
}
/**
* 获取专业对象,先判断是否实例化,没有则实例化一个
* @return
*/
public Subject getSb() {
if(this.sb == null)
this.sb = new Subject();
return sb;
}
/**
* 设置专业对象
* @param sb
*/
public void setSb(Subject sb) {
this.sb = sb;
}
/**
* 学生信息的格式化输出
* @return
*/
public String info() {
return "Students :"
+ "\n stuName=" + this.getStuName()
+ "\n stuId=" + this.getStuId()
+ "\n sex=" + this.getSex()
+ "\n age=" + this.getAge()
+ "\n subName = " + this.getSb().getSubName() // 先取专业对象,再取属性
+ "\n subId = " + this.getSb().getSubId()
+ "\n subYear = " + this.getSb().getSubYear();
}
;
}
学科专业类
package com.jachie.entiy;
/**
* 学科专业类
* @author 哒哒哒
*
*/
public class Subject {
private String subName;
private int subId;
private int subYear;
private Students [] studentsArray;
private int studentsNum;
/**
* 获取专业学生数
* @return
*/
public int getStudentsNum() {
return studentsNum;
}
/**
* 设置专业学生数
* @param studentsNum
*/
public void setStudentsNum(int studentsNum) {
this.studentsNum = studentsNum;
}
/**
* 获取专业名
* @return
*/
public String getSubName() {
return subName;
}
/**
* 获取学生数组,逻辑判断是否初始化,默认长度200
* @return
*/
public Students[] getStudentsArray() {
if(this.studentsArray == null)
this.studentsArray = new Students[200];
return studentsArray;
}
/**
* 设置学生数组,
* @param studentsArray
*/
public void setStudentsArray(Students[] studentsArray) {
this.studentsArray = studentsArray;
}
/**
* 设置专业名
* @param subName
*/
public void setSubName(String subName) {
this.subName = subName;
}
/**
* 获取专业ID
* @return
*/
public int getSubId() {
return subId;
}
/**
* 设置专业ID
* @param subId
*/
public void setSubId(int subId) {
this.subId = subId;
}
/**
* 获取年限
* @return
*/
public int getSubYear() {
return subYear;
}
/**
* 设置年限,并加以逻辑判断,默认4年
* @param subYear
*/
public void setSubYear(int subYear) {
if(subYear <= 0)
this.subYear = 4;
else
this.subYear = subYear;
}
/**
* 无参构造
*/
public Subject() {}
/**
* 3参构造
* @param subName
* @param subId
* @param subYear
*/
public Subject(String subName, int subId, int subYear) {
this.setSubName(subName);
this.setSubId(subId);
this.setSubYear(subYear);
}
/**
* 4参构造
* @param subName
* @param subId
* @param subYear
* @param studentsArray
*/
public Subject(String subName, int subId, int subYear, Students[] studentsArray ) {
this.setSubName(subName);
this.setSubId(subId);
this.setSubYear(subYear);
this.setStudentsArray(studentsArray);
}
/**
* 格式化输出专业信息
* @return
*/
public String info() {
return "Subject \n subName=" + subName + "\n subId=" + subId + "\n subYear=" + subYear ;
}
/**
* 将学生保存到数组,并实现个数的统计
* @param stu
*/
public void addStudent(Students ...stu) {
int i = 0;
// 1. 将学生保存到数组
for(int j = 0 ; i < getStudentsArray().length && j < stu.length; i++) {
if(this.getStudentsArray()[i] == null) {
// 双向关联
stu[j].setSb(this); // 实现学生与专业的关联
this.getStudentsArray()[i] = stu[j]; // 将专业与学生进行关联
j++;
continue;
}
}
// 2. 实现个数的统计
this.studentsNum = i;
}
}
测试类
package com.jachie.test;
import com.jachie.entiy.Students;
import com.jachie.entiy.Subject;
public class StudentTest {
public static void main(String[] args) {
Subject sb = new Subject("计算机专业", 001, 4);
Students stu1 = new Students("张三", 001, "man", -5);
Students stu2 = new Students("张2", 001, "man", 3);
Students stu3 = new Students("张1", 001, "man", 14);
sb.addStudent(stu1, stu2, stu3);
System.out.println(sb.getStudentsNum());
}
}
提问
- 为什么添加学生的操作不放在构造方法或set方法中
首先,构造方法是在对象构造的时候执行,可是在实际开发中无法保证在
Subject
对象创建的时候就能传入有效的学生信息,因此不采用构造方法,进行学生添加。
而使用set
方法如下public void setMyStudents(Student [ ] stu){ this.stu = stu; }
而每次进行学生添加的时候,就必须先把学生放到一个数组里,再调用
set
方法,因此不推荐。
- 为什么方法中通过get方法进行数组成员赋值而不是set
首先需要进行一个初始化判断,判断数组是否被初始化,而在
get
方法中进行了初始化的逻辑判断,为了保证数组有效。sdsd /** * 获取学生数组,逻辑判断是否初始化,默认长度200 * @return */ public Students[] getStudentsArray() { if(this.studentsArray == null) this.studentsArray = new Students[200]; return studentsArray; }
然后在循环当中进行判断数组中是否有空位,有空位,才放进去
不理解的可以看看这样一种拆分的形式,帮助理解:
拆分形式
/** * 将学生保存到数组,并实现个数的统计 * @param stu */ public void addStudent(Students ...stu) { 1. 将学生保存到数组 this.studentsArray = this.getStudentsArray(); // 1. 获取已有学生的信息 int length = this.studentsArray.length; // 2.获取数组的长度 // 3.通过循环在合适位置添加学生 for(int j = 0 ; i < length && j < stu.length; i++) { if(this.studentsArray[i] == null) { // 双向关联 stu[j].setSb(this); // 实现学生与专业的关联 this.studentsArray[i] = stu[j]; // 将专业与学生进行关联 j++; continue; } } // 2. 实现个数的统计 this.studentsNum = i; }
原形式
public void addStudent(Students ...stu) { int i = 0; // 1. 将学生保存到数组 for(int j = 0 ; i < getStudentsArray().length && j < stu.length; i++) { if(this.getStudentsArray()[i] == null) { // 双向关联 stu[j].setSb(this); // 实现学生与专业的关联 this.getStudentsArray()[i] = stu[j]; // 将专业与学生进行关联 j++; continue; } } // 2. 实现个数的统计 this.studentsNum = i; }
- 为什么要通过get方法获取数组取得长度,直接用属性不行么
与前面的相同,为了保证数组初始化,至少拥有默认值,防止空指针异常
/** * 获取学生数组,逻辑判断是否初始化,默认长度200 * @return */ public Students[] getStudentsArray() { if(this.studentsArray == null) this.studentsArray = new Students[200]; return studentsArray; }
通过此操作,数组长度要么是200,要么是实际内容长度。