1 class Teacher: 2 //屬性 3 String tname; 4 Set<Student> students; 5 6 //有參構造函數 7 Teacher(String tname, Set<Student> students ); 8 9 //setter,getter省略 10 11 class Student: 12 //屬性 13 String sname; 14 Teacher teachrer; 15 16 //有參構造函數 17 Student(String sname,Teacher teacher); 18 19 //setter,getter省略 20 main: 21 Teacher t = new Teacher("Maker",new hashSet()); 22 23 Student s1 = new Studnet("student1",null); 24 Student s2 = new Studnet("student2",null); 25 26 s1.getTeacher(t); 27 t.getStudnet().add(s1); 28 29 30 s1 = null; 31 s2 = null; 32 t = null;
在上面代碼中,s2所引用的對象在31行時就結束了生命周期,而s1和t所引用的對象在32行結束生命周期,下面請看java在生命周期的流程:
一:21~24行創建了一個Teacher對象和兩個Student對象,並且定義了3個引用變量t,s1,s2分別引用了Teacher對象,Student1對象和Student2對象,如下圖所示:

二:26~27行建立了Teacher對象和Student對象的雙向關聯關系,表示Student1對象的teacher屬性引用了Teacher對象,Teacher對象的students集合存放了Student1對象的引用。

三:在30行中,雖然把s1變量置為了null,s1變量不再引用Studetn1對象了,但中Teacher對象的students仍然存放着Student1對象的引用,那么Student1對象就會結束生命周期;把s2變量置為null,Student2對象不再被任何引用量變引用,也自然的就結束了生命周期,最終被JVM垃圾回收器收回之前所占用的內存;把t置o null后,Teacher不再被任何引用變量所引用,自然Student1對象的引用也產存在了,也就結束了周期。如下圖所示:

雖然最后Teacher和Student之前還存在着雙向引用,但是在程序中並沒有任何引用變量來引用這兩個對象,程序也就無法訪問到這個兩個變量,最終還是被JVM的垃圾回收器當作無用的對象所回收。
注意:Java集合(如Set,List,Map)中存放着的是java對象的引用,當向集合添加一個對象時,其實就是把這個對象的引用添加到集合中。
