案例分析
1.其中的相关类信息
1.专业类
属性:专业编号、专业名称、学限年限
方法:介绍(介绍专业相关信息)
2.学生类
属性:专业编号、专业名称、学限年限
方法:自我介绍(介绍学生相关信息)
实现专业与学生关联
方案1:在学生类的自我介绍方法中,添加两个参数:专业名称、学制年限
方案2:在学生类的自我介绍方法中,添加一个专业对象作为参数,从中获取专业名称、学制年限
方案3:在学生类中,添加一个专业对象作为属性,从中获取专业名称、学制年限
实现方案
在专业类中添加属性:学生数组、学生总人数添加方法:新增学生(功能:将新增学生插入数组,并获取学生总人数)
学生类代码
package com.list.model;
/**
* 学生类
*
* @author List
*
*/
public class Student {
private String studentName;
private String studentNo;
private String studentSex;
private int studentAge;
private Subject studentSubject;//建立Subject类的对象
// 无参构造
public Student() {
}
// 带参构造对学生的全部属性进行赋值
public Student(String studentName, String studentNo, String studentSex, int studentAge,Subject studentSubject) {
this.setStudentName(studentName);
this.setStudentNo(studentNo);
this.setStudentSex(studentSex);
this.setStudentAge(studentAge);
this.setStudentSubject(studentSubject);
}
// 带参构造对学生的姓名,学号,性别,年龄属性进行赋值
public Student(String studentName, String studentNo, String studentSex, int studentAge) {
this.setStudentName(studentName);
this.setStudentNo(studentNo);
this.setStudentSex(studentSex);
this.setStudentAge(studentAge);
}
// 以下是封装接口
/**
* 选修专业学生信息,如为初始化将自动初始化
* @return 选修专业学生信息
*/
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
public String getStudentSex() {
return studentSex;
}
public void setStudentSex(String studentSex) {
if (studentSex == "男" || studentSex == "女")
this.studentSex = studentSex;
else
this.studentSex = "男";
}
public int getStudentAge() {
return studentAge;
}
/**
* 对年龄进行限制
*
* @param studentAge
*/
public void setStudentAge(int studentAge) {
if (studentAge > 10 && studentAge < 100)
this.studentAge = studentAge;
else
this.studentAge = 18;
}
/**
* 限制如果专业信息为空则实例化进行赋值
* @return 专业信息
*/
//方法三的应用
public Subject getStudentSubject() {
if(this.studentSubject==null)
this.studentSubject=new Subject();
return studentSubject;
}
public void setStudentSubject(Subject studentSubject) {
this.studentSubject = studentSubject;
}
/**
* 学生信息
*
* @return 学生信息如下:姓名,学号,性别,年龄
*/
public String infoStu() {
String info = "学生信息:\n姓名:" + getStudentName() + "\n学号:" + getStudentNo() + "\n性别:" + getStudentSex() + "\n年龄:"
+ getStudentAge()+"\n专业名称:"
//这是方法三中利用对象作为属性,先this调用studentSubject的get方法再调用Subject中的getSubjectName
+this.getStudentSubject().getSubjectName()+"\n专业编号:"
+this.getStudentSubject().getSubjectNo()+"\n专业年限:"
+this.getStudentSubject().getSubjectLife();
return info;
}
/**
* 学生信息
* @param subjectName 专业名称
* @param subjectLife 学年年限
* @return 学生信息如下:姓名,学号,性别,年龄,专业名称,年限
*/
//方法的重载方法一
public String infoStu(String subjectName,int subjectLife) {
String info = "学生信息:\n姓名:" + getStudentName() + "\n学号:" + getStudentNo() + "\n性别:" + getStudentSex() + "\n年龄:"
+ getStudentAge()+"\n专业名称:"+subjectName+"\n专业年限:"+subjectLife;
return info;
}
/**
* 学生信息
* @param mySubject 专业信息对象
* @return 学生信息如下:姓名,学号,性别,年龄,专业名称,专业编号,年限
*/
//方法的重载方法二:;利用对象
public String infoStu(Subject mySubject) {
String info = "学生信息:\n姓名:" + getStudentName() + "\n学号:" + getStudentNo() + "\n性别:" + getStudentSex() + "\n年龄:"
+ getStudentAge()+"\n专业名称:"+mySubject.getSubjectName()+"\n专业编号:"+mySubject.getSubjectNo()+"\n专业年限:"+mySubject.getSubjectLife();
return info;
}
}
专业类代码
package com.list.model;
/**
* 专业类
* @author List
*
*/
public class Subject {
private String subjectName;
private String subjectNo;
private int subjectLife;
private Student[] myStudents;//建立Student类的数组对象
private int studentNumber;
//这是无参构造
public Subject() {
}
//这是用于属性赋值的带参构造
public Subject(String subjectName,String subjectNo,int subjectLife) {
// this.subjectName=subjectName;
// this.subjectNO=subjectNo;
// this.subjectLife=subjectLife;
//方法赋值安全系数高一些
this.setSubjectLife(subjectLife);
this.setSubjectName(subjectName);
this.setSubjectNo(subjectNo);
}
public Student[] getMyStudents() {
if(this.myStudents==null)
this.myStudents=new Student[10];
return myStudents;
}
public void setMyStudents(Student[] myStudents) {
this.myStudents = myStudents;
}
public int getStudentNumber() {
return studentNumber;
}
public void setSutdentNumber(int studentNumber) {
this.studentNumber = studentNumber;
}
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;
}
public void setSubjectLife(int subjectLife) {
if(subjectLife<=0)
return ;
this.subjectLife = subjectLife;
}
/**
* 专业信息
* @return 返回的专业信息如下:专业名称,专业编号,专业年限
*/
public String infoSub() {
String info="专业信息如下:\n专业名称:"+getSubjectName()+"\n专业编号:"+getSubjectNo()+"\n专业年限"+getSubjectLife();
return info;
}
/**
* 添加学生信息到本专业中
* @param stu 对象参数
*/
public void addStudent(Student stu) {
for(int n=0;n<this.getMyStudents().length;n++) {
if(this.getMyStudents()[n]==null) {
//这句也是建立学生信息与专业信息的关联,也是程序的优化!
stu.setStudentSubject(this);//通过此方法建立的Student对象调用studentSubject对象的set,这里的this是谁(对象)调用addStudent方法就是this.谁(对象)
//这句只是专业学生信息和学生建立了关联,并没有建立学生信息与专业信息的关联
this.getMyStudents()[n]=stu;//调用myStudents的get,因为返回值是一个Student的数组,所以要加下标,赋值是对象参数
this.studentNumber=n+1;//此处是对专业进行计数
return ;//直接结束addStudent方法
}
}
}
/**
* 显示全部此专业学生信息
*/
public void showStudent() {
int list;
for(int n=0;n<this.getMyStudents().length;n++) {
if(this.getMyStudents()[n]!=null) {
list=n+1;
System.out.println("序号:"+list);
System.out.print("姓名:"+this.getMyStudents()[n].getStudentName()+" ");
System.out.print("学号:"+this.getMyStudents()[n].getStudentNo()+" ");
System.out.print("性别:"+this.getMyStudents()[n].getStudentSex()+" ");
System.out.println("年龄:"+this.getMyStudents()[n].getStudentAge()+" ");
}
else {
list=n+1;
System.out.println("当前序号"+list+"无学生信息");
break;
}
}
}
}
测试类代码
package com.list.test;
import com.list.model.Subject;
import com.list.model.Student;
/**
* 测试类
* 对于学生与专业信息关联,方法三的关联性最好
* @author List
*
*/
public class SchoolTest {
public static void main(String[] args) {
Subject sub=new Subject("计算机软件工程","J0001",4);
Student stu1=new Student("张三","s01","男",18);
Student stu2=new Student("李四","s02","女",17);
Student stu3=new Student("王五","s03","男",18);
Student stu4=new Student("刘六","s04","女",17,sub); //这是方法三中带参赋值全部属性,需要传递对象
//一次一次实现查看信息
/*System.out.println(test.getSubjectName());
System.out.println(test.getSubjectNo());
System.out.println(test.getSubjectLife());*/
//利用方法查看信息
/*System.out.println(sub.infoSub());
System.out.println("_____***_____");
System.out.println(stu1.infoStu());
System.out.println("_____***_____");
System.out.println(stu2.infoStu("计算机软件工程",4));//方法一
System.out.println("_____***_____");
//方法重载2中是参数是对象,传送值也应该传入对象
System.out.println(stu3.infoStu(sub));//方法二
System.out.println("_____***_____");
System.out.println(stu4.infoStu());*///方法三
//添加学生信息
sub.addStudent(stu1);
sub.addStudent(stu2);
sub.addStudent(stu3);
sub.addStudent(stu4);
sub.showStudent();
}
}
总结
1.案例中是在同Project下,但使用的是不同包下进行测试的
项目名:SchoolProj
包名:com.list.model 中类 Student 与Subject
com.list.test中类 SchoolTest
2.由于现阶段只运用了封装的知识 并没有继承,所以在学生类和专业类中展示信息并没有重写Object中的toString方法