xscn

博客园 首页 新随笔 联系 订阅 管理

摘自《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 秒) - 正常终止

 

 

 

 

 

 

 

 

posted on 2013-08-09 23:27  xscn  阅读(5653)  评论(0编辑  收藏  举报