07.封装的综合运用——学生信息管理(非集合版)

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

}

提问

  1. 为什么添加学生的操作不放在构造方法或set方法中

首先,构造方法是在对象构造的时候执行,可是在实际开发中无法保证在Subject对象创建的时候就能传入有效的学生信息,因此不采用构造方法,进行学生添加。
而使用set方法如下

public void setMyStudents(Student [ ]  stu){
		this.stu = stu;
}

而每次进行学生添加的时候,就必须先把学生放到一个数组里,再调用set方法,因此不推荐。

  1. 为什么方法中通过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;
	}
  1. 为什么要通过get方法获取数组取得长度,直接用属性不行么

与前面的相同,为了保证数组初始化,至少拥有默认值,防止空指针异常

	/**
	 * 获取学生数组,逻辑判断是否初始化,默认长度200
	 * @return
	 */
	public Students[] getStudentsArray() {
		if(this.studentsArray == null)
			this.studentsArray = new Students[200];
		return studentsArray;
	}

通过此操作,数组长度要么是200,要么是实际内容长度。

实例下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

空 白

停止的只会是自己,你得追逐世界

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

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

打赏作者

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

抵扣说明:

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

余额充值