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