摘自《java开发实战经典》李兴华.著
一对多的关系
一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,此时就可以通过类集进行关系的表示。
在定义Student类中包含了一个School属性,表示一个学生属于一个学校。在程序运行时,只需要传入School类的引用就可以完成这样的关系。
在定义School类时定义了一个List类型的属性,并指定其泛型类型是Student类型,这样一来就表示在一个School对象中会包含多个Student类型的引用。
最后在主函数设置学校和学生的对应关系。也可以用Map来实现学校映射学生的list集合之间的关系。
1 import java.util.*;
2 public class TestDemo{//设置学校和学生的关系
3 public static void main(String args[]){
4 School sch = new School("清华大学") ;//实例化学校对象
5 Student s1 = new Student("张三",21) ;//实例化学生对象
6 Student s2 = new Student("李四",22) ;
7 Student s3 = new Student("王五",23) ;
8 sch.getAllStudents().add(s1) ;//在学校中加入学生
9 sch.getAllStudents().add(s2) ;
10 sch.getAllStudents().add(s3) ;
11 s1.setSchool(sch) ;//一个学生属于一个学校
12 s2.setSchool(sch) ;
13 s3.setSchool(sch) ;
14 System.out.println(sch) ;
15 Iterator<Student> iter = sch.getAllStudents().iterator() ;
16 while(iter.hasNext()){
17 System.out.println("\t|- " + iter.next()) ;
18 }
19 }
20 }
21
22 //学生类
23 class Student{
24 private String name ;
25 private int age ;
26 private School school; // 一个学生属于一个学校
27 public Student(String name,int age){
28 this.setName(name) ;
29 this.setAge(age) ;
30 }
31 public void setSchool(School school){
32 this.school = school ;
33 }
34 public School getSchool(){
35 return this.school ;
36 }
37 public void setName(String name){
38 this.name = name ;
39 }
40 public void setAge(int age){
41 this.age = age ;
42 }
43 public String getName(){
44 return this.name;
45 }
46 public int getAge(){
47 return this.age ;
48 }
49 public String toString(){
50 return "学生姓名:" + this.name + ";年龄:" + this.age ;
51 }
52 }
53
54 //学校类
55 class School{
56 private String name ;
57 private List<Student> allStudents ;//一个学校有多个学生
58 public School(String name){
59 this.allStudents = new ArrayList<Student>();
60 this.setName(name) ;
61 }
62 public void setName(String name){
63 this.name = name ;
64 }
65 public String getName(){
66 return this.name;
67 }
68 public List<Student> getAllStudents(){//取得全部的学生
69 return this.allStudents ;
70 }
71 public String toString(){
72 return "学校名称:" + this.name ;
73 }
74 }
多对多关系
使用类集不仅可以表示出一对一的关系,也可以表示出多对多的关系。例如,一个学生可以选多门课程,一门课程可以有多个学生参加,那么这就是一个典型的多对多关系。
要完成本程序,首先应该定义两个类:学生信息类Student、课程信息类Course。在一个学生类中存在一个集合,保存全部的课程;而在课程类中也要存在一个集合,保存全部的学生。
1 import java.util.*;
2 // 定义学生类
3 class Student {
4 private String name ;
5 private int age ;
6 private List<Course> allCourses ; // 定义集合保存全部课程
7 public Student(){// 无参构造
8 this.allCourses = new ArrayList<Course>() ;// 实例化List集合
9 }
10 public Student(String name,int age){ // 通过构造设置属性内容
11 this() ; // 调用无参构造
12 this.setName(name) ; // 设置name属性内容
13 this.setAge(age) ; // 设置age属性内容
14 }
15 public String getName() {
16 return name;
17 }
18 public void setName(String name) {
19 this.name = name;
20 }
21 public int getAge() {
22 return age;
23 }
24 public void setAge(int age) {
25 this.age = age;
26 }
27 public List<Course> getAllCourses() { // 取得全部课程
28 return allCourses;
29 }
30 public String toString(){ // 覆写toString()方法
31 return "学生姓名:" + this.name + ";年龄:" + this.age ;
32 }
33 }
34
35
36 //在学生类中存在一个allCourses的List集合,这样在程序运行时,一个学生类中可以保存多个Course对象。
37
38 //定义课程类
39 class Course {
40 private String name ; //
41 private int credit ; // 定义学分
42 private List<Student> allStudents ; // 定义集合保存多个学生
43 public Course(){ // 无参构造方法
44 this.allStudents = new ArrayList<Student>() ;// 实例化List集合
45 }
46 public Course(String name,int credit){ //
47 this() ;
48 this.setName(name) ;
49 this.setCredit(credit) ;
50 }
51 public String getName() {
52 return name;
53 }
54 public void setName(String name) {
55 this.name = name;
56 }
57 public int getCredit() {
58 return credit;
59 }
60 public void setCredit(int credit) {
61 this.credit = credit;
62 }
63 public List<Student> getAllStudents() { // 得到全部学生
64 return allStudents;
65 }
66 public void setAllStudents(List<Student>allStudents) {// 设置全部学生
67 this.allStudents = allStudents;
68 }
69 public String toString(){
70 return "课程名称:" + this.name + ";课程学分" + this.credit ;
71 }
72 }
73
74 //课程类与学生类一样,都定义了一个List集合,用于保存多个学生信息。
75
76
77
78
79 public class TestMore {
80 public static void main(String args[]) {
81 Course c1 = new Course("英语", 3); // 实例化课程对象
82 Course c2 = new Course("计算机", 5);
83 Student s1 = new Student("张三", 20); // 实例化学生对象
84 Student s2 = new Student("李四", 21);
85 Student s3 = new Student("王五", 22);
86 Student s4 = new Student("赵六", 23);
87 Student s5 = new Student("孙七", 24);
88 Student s6 = new Student("钱八", 25);
89 // 第一门课程有3个人参加,向课程中增加3个学生信息,同时向学生中增加课程信息
90 c1.getAllStudents().add(s1); // 向课程增加学生信息
91 c1.getAllStudents().add(s2);
92 c1.getAllStudents().add(s6);
93 s1.getAllCourses().add(c1); // 向学生中增加课程信息
94 s2.getAllCourses().add(c1);
95 s6.getAllCourses().add(c1);
96 // 第二门课程有6个人参加,向课程中增加6个学生信息,同时向学生中增加课程信息
97 c2.getAllStudents().add(s1); // 向课程增加学生信息
98 c2.getAllStudents().add(s2);
99 c2.getAllStudents().add(s3);
100 c2.getAllStudents().add(s4);
101 c2.getAllStudents().add(s5);
102 c2.getAllStudents().add(s6);
103 s1.getAllCourses().add(c2);// 向学生中增加课程信息
104 s2.getAllCourses().add(c2);
105 s3.getAllCourses().add(c2);
106 s4.getAllCourses().add(c2);
107 s5.getAllCourses().add(c2);
108 s6.getAllCourses().add(c2);
109 // 输出一门课程的信息,观察一门课程有多少个学生参加
110 System.out.println(c1); // 输出第一门课程信息
111 Iterator<Student> iter1 = c1.getAllStudents().iterator();
112 while (iter1.hasNext()) { // 迭代
113 Student s = iter1.next();// 取出学生对象
114 System.out.println("\t|- " + s); // 输出学生信息
115 }
116 // 输出一个学生参加的课程信息,观察有多少门课程
117 System.out.println(s6); // 输出学生信息
118 Iterator<Course> iter2 = s6.getAllCourses().iterator();
119 while (iter2.hasNext()) { // 迭代
120 Course c = iter2.next(); // 取得所参加的课程
121 System.out.println("\t|- " + c); // 输出课程信息
122 }
123 }
124 }
125 ---------- java ----------
126 课程名称:英语;课程学分3
127 |- 学生姓名:张三;年龄:20
128 |- 学生姓名:李四;年龄:21
129 |- 学生姓名:钱八;年龄:25
130 学生姓名:钱八;年龄:25
131 |- 课程名称:英语;课程学分3
132 |- 课程名称:计算机;课程学分5
133
134 输出完成 (耗时 0 秒) - 正常终止