• 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 = "专业信息如下:
    专业名称:" + 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中进行初始化。
    
  • 相关阅读:
    常见前端面试题CSS部分
    window.location
    实时时间设置
    常用兼容处理
    背景淡入淡出切换
    常用插件
    PHP文件处理函数
    PHP的数据处理函数二(数组)
    php的数据处理函数一(字符串)
    PHP环境搭建(phpstudy)
  • 原文地址:https://www.cnblogs.com/Rowry/p/15086773.html
Copyright © 2020-2023  润新知