![10454141bc627796e25383062c272670.png](https://i-blog.csdnimg.cn/blog_migrate/53cf996efbfacd982643b648ec4a2a51.jpeg)
封装-小项目练习
来自 http:// imooc.com 《Java工程师课程》
1.拟实现项目信息:
![2fbd1c059fc62b66bae5327087fed646.png](https://i-blog.csdnimg.cn/blog_migrate/d6a66ca78d0c5d442eab04b5688eb453.jpeg)
![adc6fbbe708cca97e93bbacd9b658dc6.png](https://i-blog.csdnimg.cn/blog_migrate/9e27d46371d976f438b4138097d94451.jpeg)
![e5c4506881e830a732296c08f2963643.png](https://i-blog.csdnimg.cn/blog_migrate/ec9d8651f7fdfddab3bb2f153c6daf1e.jpeg)
2.信息分析
1.专业类:
- 属性:专业名称,编号,学制年限
- 方法:介绍专业相关信息
2.学生类:
- 属性:专业名称,编号,学制年限
- 方法:介绍学生相关信息
3.两个类的信息关联(实现代码尽可能少)
- 方案1:学生类介绍方法中,添加专业名称,学制年限两个参数;
- 方案2:学生类介绍方法中,添加一个专业对象作为参数,从中获取专业名称,学制年限;
- 方案3:学生类中,添加一个专业对象作为属性,从中获取专业名称,学制年限
3.代码实现
Subject.java
package com.imooc.Subject;
/**
* @author sbt
* 写完后才发现这个其实可以都将其作为静态属性的
*/
public class Subject {
// 成员属性:专业名称,编号,学制年限,以及后面拓展所需要的 学生数组和学生总数
private String name;
private String id;
private int duration;
private Student[] myStudents;
private int studentNum;
//无参构造方法 无论是否用到,先显式把这个写上
public Subject(){}
//带有名称,编号,学制年限的有参构造方法
public Subject(String name,String id,int duration){
this.setName(name);
this.setId(id);
this.setDuration(duration);
}
//带参构造,实现对所有属性的初始化
public Subject(String name,String id,int duration,Student[] myStudents){
this.setName(name);
this.setId(id);
this.setDuration(duration);
this.setmyStudents(myStudents);
}
public Student[] getmyStudents() {
if(this.myStudents == null)
this.myStudents=new Student[200];
return myStudents;
}
public void setmyStudents(Student[] myStudents) {
this.myStudents = myStudents;
}
public void setName(String name){
this.name = name;
}
public void setId(String id) {
this.id = id;
}
public void setDuration(int duration) {
if( duration >0)
this.duration = duration;
else
System.out.println("学制年限设置错误:年限必须要大于0");
}
public String getName() {
return name;
}
public String getId() {
return id;
}
public int getDuration() {
return duration;
}
public int getStudentNum() {
return studentNum;
}
public void setStudentNum(int studentNum) {
this.studentNum = studentNum;
}
/**
* 专业介绍方法
* @return
*/
public String info(){
String str="专业信息如下:n专业名称:" + this.name + "n专业编号:" + this.id
+ "n学制年限:" + this.duration + "年";
return str;
}
Student.java
package com.imooc.Subject;
public class Student {
// 成员属性:学生姓名,学号,性别,年龄,以及方案3的专业对象相关信息
private String name;
private String id;
private String gender;
private int age;
private Subject studentSubject; // 方案3:将项目对象作为属性
public Student(){}
//将专业与学生相关联,少写代码,有三种方法比较好:直接传参,将对象作为参数,和将对象作为类属性
public Student(String name,String id,String gender,int age) {
this.name=name;
this.id=id;
this.gender=gender;
this.age=age;
}
//带参构造,实现对所有属性的初始化
public Student(String name,String id,String gender,int age, Subject studentSubject) {
this.setName(name);
this.setId(id);
this.setGender(gender);
this.setAge(age);
this.setStudentSubject(studentSubject);
}
public Subject getStudentSubject(){
if(studentSubject==null){
Subject studentSubject = new Subject();
}
return studentSubject;
}
public void setStudentSubject(Subject studentSubject) {
this.studentSubject = studentSubject;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age >18 && age <100)
this.age = age;
else
this.age = 18;
}
/**
* 学生信息展示
* 方法1 直接传参,
* @param subjectname 专业名称
* @param subjectyear 专业年限
* @return 学生个人信息
*/
public String info(String subjectname,int subjectyear) {
String str = "学生信息如下:n姓名:" + this.getName() + "n学号:" + this.getId()
+ "n性别:" + this.getGender() + "n年龄:" + this.getAge() + "n所报专业名称:"
+ subjectname + "n学制年限:" + subjectyear;
return str;
}
/**
* 学生信息展示的方法
* 方法2,将对象作为参数
* @return 姓名,学号,性别,年龄
*/
public String info(Subject mySubject) {
String str = "学生信息如下:n姓名:" + this.getName() + "n学号:" + this.getId()
+ "n性别:" + this.getGender() + "n年龄:" + this.getAge() + "n所报专业名称:"
+ mySubject.getName() + "n学制年限:" + mySubject.getDuration();
return str;
}
/**
* 方法3 将Subject对象作为Student类的一个属性
* @return
*/
public String info() {
String str = "学生信息如下:n姓名:" + this.getName() + "n学号:" + this.getId()
+ "n性别:" + this.getGender() + "n年龄:" + this.getAge() + "n所报专业名称:"
+ this.getStudentSubject().getName() + "n学制年限:" + this.getStudentSubject().getDuration();
return str;
}
}
Test.java
package com.imooc.Subject;
public class Test {
public static void main(String[] args) {
Subject sub1=new Subject("计算机科学与应用","J0001", 4);
System.out.println(sub1.info());
System.out.println("~~~~~~");
Student stu1=new Student("张三","S01","男",18);
System.out.println(stu1.info("计算机科学与应用",4));
System.out.println("~~~~~~");
Student stu2=new Student("李四","S02","女",17);
System.out.println(stu2.info(sub1));
System.out.println("~~~~~~");
Student stu3=new Student("王五","S03","男",18,sub1);
System.out.println(stu3.info());
//测试指定专业中有多少学生报名
sub1.addStudent(stu1);
sub1.addStudent(stu1);
sub1.addStudent(stu1);
System.out.println(sub1.getName() + "的专业中有" + sub1.getStudentNum() + "个学生在学习。");
}
}
4.总结
个人觉得这是一个比较好的锻炼自己的面对对象,和封装以及实现两个类之前如何相互关联的练习项目,特别是以对象作为方法参数以及作为另一个类的属性的思想。因此记录一下。