目录
1.案例:根据以下数据完成案例实现
学校开设计算机专业,专业编号为J0001,学制4年,现在3名学员都报名学习了这个专业,数据信息如下表:
信息分析
1.专业类:
属性:专业名称,编号,学制年限
方法:介绍专业相关信息
2.学生类:
属性:专业名称,编号,学制年限
方法:介绍学生相关信息
3.两个类的信息关联(实现代码尽可能少)
方案1:学生类介绍方法中,添加专业名称,学制年限两个参数;
方案2:学生类介绍方法中,添加一个专业对象作为参数,从中获取专业名称,学制年限;
方案3:学生类中,添加一个专业对象作为属性,从中获取专业名称,学制年限
Student类
public class Student {
private String studentId;
private String studentName;
private String studentSex;
private int studentAge;
private Subject studentSubject; // 注意!
// 无参构造方法
public Student() {
}
public Student(String studentId, String studentName, String studentSex, int studentAge) {
super();
this.setStudentId(studentId);
this.setStudentName(studentName);
this.setStudentSex(studentSex);
this.setStudentAge(studentAge);
}
// 带参构造,实现对全部参数的赋值
public Student(String studentId, String studentName, String studentSex, int studentAge, Subject studentSubject) {
super();
this.setStudentId(studentId);
this.setStudentName(studentName);
this.setStudentSex(studentSex);
this.setStudentAge(studentAge);
this.setStudentSubject(studentSubject);
}
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
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 (!(studentSex == "男" || studentSex == "女")) {
this.studentSex = "男";
} else
this.studentSex = studentSex;
}
public int getStudentAge() {
return studentAge;
}
/**
* 给年龄赋值,限制在10——100之间,反之就设置为18
*
* @param studentAge传入的年龄
*/
public void setStudentAge(int studentAge) {
if (studentAge < 10 || studentAge > 100) {
this.studentAge = 18;
} else
this.studentAge = studentAge;
}
/**
* 获取专业对象,若没有实例化,则先实例化后再返回
*
* @return 专业对象信息
*/
public Subject getStudentSubject() {
if (studentSubject == null)
this.studentSubject = new Subject();
return studentSubject;
}
public void setStudentSubject(Subject studentSubject) {
this.studentSubject = studentSubject;
}
/**
* 法1 在方法中添加1个专业对象作为参数,通过其属性获得相关信息
* 更简单,获得参数方便
* @param sub1
*
* @return自我介绍的信息,包括姓名、学号、性别、年龄
*/
public String introduction(Subject mySubject) {
String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n学号:" + this.getStudentId() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + this.getStudentAge() + "\n所报专业名称:" + mySubject.getSubjectName()
+ "\n学制年限:" + mySubject.getSubjectYear() + "\n专业编号:" + mySubject.getSubjectId();
return str;
}
/**
* 法2 在类中添加专业作为属性,通过其属性获得相关信息
* 关联性更强
*/
public String introduction() {
String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n编号:" + this.getStudentId() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + getStudentAge() + "\n所报专业名称:"
+ this.getStudentSubject().getSubjectName() + "\n学制年限:" + this.getStudentSubject().getSubjectYear()
+ "年" + "\n专业编号:" + this.getStudentSubject().getSubjectId();
return str;
}
/**
* 法3 在方法中添加2个参数,分别表示专业名称和学制年限
* 易理解,但参数列表长
* @param subjectName
* @param subjectYear
* @return
*/
public String introduction(String subjectName, int subjectYear) {
String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n编号:" + this.getStudentId() + "\n性别:"
+ this.getStudentSex() + "\n年龄:" + getStudentAge() + "\n所报专业名称:" + subjectName + "\n学制年限:" + subjectYear
+ "年";
return str;
}
}
Subject类
/**
* 专业类
* @author Terita
*
*/
public class Subject {
//成员属性:学科名称,学科编号,学制年限,报名选修的学生信息,报名选修的学生个数
private String subjectName;
private String subjectId;
private int subjectYear;
private Student[] myStudents; //数组是引用类型,默认初始值是null
private int studentNum; //因为数组只能描述空间长度,无法准确描述其数据个数
// 无参构造方法
public Subject() {
}
//带参构造
public Subject(String subjectName, String subjectId, int subjectYear) {
this.subjectName = subjectName; // 赋值方法①
this.setSubjectId(subjectId); // 赋值方法②(推荐!)
this.setSubjectYear(subjectYear);
}
// 带参构造方法,实现对属性的全部赋值
public Subject(String subjectName, String subjectId, int subjectYear,Student[] myStudents) {
this.subjectName = subjectName; // 赋值方法①
this.setSubjectId(subjectId); // 赋值方法②(推荐!)
this.setSubjectYear(subjectYear);
this.setMyStudents(myStudents);
}
public String getSubjectName() {
return subjectName;
}
public void setSubjectName(String subjectName) {
this.subjectName = subjectName;
}
public String getSubjectId() {
return subjectId;
}
public void setSubjectId(String subjectId) {
this.subjectId = subjectId;
}
public int getSubjectYear() {
return subjectYear;
}
// 限制年限必须>0
public void setSubjectYear(int subjectYear) {
if (subjectYear <= 0)
return; // 结束
this.subjectYear = subjectYear;
}
/**
* 获取选修专业的学生信息
* 如果学生数组未被初始化,则给它开辟一块空间
* @return
*/
public Student[] getMyStudents() {
if (this.myStudents==null)
this.myStudents=new Student[200];
return myStudents;
}
public void setMyStudents(Student[] myStudents) {
this.myStudents = myStudents;
}
public int getStudentNum() {
return studentNum;
}
public void setStudentNum(int studentNum) {
this.studentNum = studentNum;
}
/**
* 专业介绍的方法
* @return专业介绍的相关信息,包括名称、编号和年限
*/
public String info() {
String str = "专业信息如下:\n专业名称:" + this.getSubjectName() + "\n专业编号:" + this.getSubjectId() + "\n学制年限:"
+ this.getSubjectYear()+"年";
return str;
}
public void addStudents(Student stu) {
//1.将学生保存在数组中
int i;
for (i = 0; i < this.getMyStudents().length; i++) {
if (this.getMyStudents()[i]==null) {
this.getMyStudents()[i]=stu;
//将学生个数保存在studentNum
this.studentNum=i+1;
return;
}
}
}
}
测试类
public class TestStudent {
public static void main(String[] args) {
//测试Subject
Subject sub1=new Subject("计算机科学与应用","S100",4);
System.out.println(sub1.info());
System.out.println("**************************");
//测试Student
Student stu1=new Student("01","张三","你看",200,sub1);
System.out.println(stu1.introduction());
System.out.println("==========================");
Student stu2=new Student("02","李四","男",17);
System.out.println(stu2.introduction("计算机科学与应用",4));
System.out.println("==========================");
Student stu3=new Student("03","王五","女",18);
System.out.println(stu3.introduction(sub1));
System.out.println("==========================");
//测试指定专业中有多少学生报名
sub1.addStudents(stu1);
sub1.addStudents(stu2);
sub1.addStudents(stu3);
System.out.println(sub1.getSubjectName()+"专业已有"+sub1.getStudentNum()+"名学生报名");
}
}
2.编写自定义类实现图书信息设置
任务:
属性:书名、作者、出版社、价格
方法:信息介绍
要求:
1. 设计构造函数实现对属性赋值
2. 设置私有属性,get/set方法实现对属性的访问
3. 限定图书价格必须大于10,如果无效需进行提示,并强制赋值为10
4. 限定作者、书名均为只读属性
5. 信息介绍方法描述图书所有信息
public class Book {
// 属性
private String name = "平凡的世界";
private String author = "路遥";
private String publishe;
private double price;
// 方法
// 构造方法
// 限定作者、书名均为只读属性
public Book(String name,String author,String publishe, double price) {
this.name = name;
this.author = author;
this.publishe = publishe;
this.price = price;
}
// get/set方法实现对属性的访问
public String getName() {
return name;
}
public String getAuthor() {
return author;
}
public String getPublishe() {
return publishe;
}
public void setPublishe(String publishe) {
this.publishe = publishe;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
// 限定图书价格必须大于10,如果无效需进行提示,并强制赋值为10
// 限定作者、书名均为只读属性
// 信息介绍方法描述图书所有信息
public void show(){
System.out.println(getAuthor());
System.out.println(getPrice());
System.out.println(getName());
System.out.println(getPublishe());
}
}
测试类
public class TestBook {
public static void main(String[] args) {
//构造方法,创建对象,赋值
Book book=new Book("三体","刘慈欣","湖南出版社",0);
//图书价格必须大于10,如果无效需进行提示,并强制赋值为10
if(book.getPrice()<10){
System.out.println("图书价钱较低,增为10元");
book.setPrice(10);
}
//显示所有的信息
book.show();
}
}