當應用程序通過new語句創建一個Java對象時,JVM(Java 虛擬機)會爲這個對象分配一塊內存空間,只要這個對象被引用變量引用,它就一直存在與內存中。如果這個對象不被任何引用變量引用,它就結束生命週期,此時JVM的垃圾回收器會在適當時候回收它佔用的內存。
說明代碼如下:
Bus類(部分代碼省略):
public class Bus {
private String busName;
private Set wheels=new HashSet();
private String engine;
……
Bus(){
}
Bus(String name){
this.setBusName(name);
}
public String getBusName() {
return busName;
}
public void setBusName(String busName) {
this.busName = busName;
}
public void setWheels(Set wheels) {
this.wheels = wheels;
}
public Set getWheels() {
return wheels;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
……
}
它與Wheel類是一對多的關係,所以在Bus類中定義了一個屬性
private Set wheel=new HashSet();
用來存放於Bus類關聯的Wheel對象
Wheel類(部分代碼省略):
public class Wheel {
private String wheelName;
……
Wheel(){
}
Wheel(String name){
this.setWheelName(name);
}
public String getWheelName() {
return wheelName;
}
public void setWheelName(String wheelName) {
this.wheelName = wheelName;
}
……
}
測試的Main類:
public class Main {
public static void main(String[] args) {
Bus b=new Bus("My bus");
Wheel w1=new Wheel("No 1");
Wheel w2=new Wheel("No 2");
b.getWheels().add(w1);
w1=null; //Mark 1
w2=null; //Mark 2
b=null; //Mark 3
}
}
對於以上代碼,w2對象在Mark 2行結束了生命週期,而w1和b對象是在Mark 3行結束生命週期。
分析如下:
1. 如圖7-1,創建1個Bus對象和2個Wheel對象,並且定義了三個引用變量b,w1,w2分別引用這三個對象。
Bus b=new Bus("My bus");
Wheel w1=new Wheel("No 1");
Wheel w2=new Wheel("No 2");
7-1
2. 如圖7-2,建立Bus和Wheel對象的關聯後,意味着在Bus對象的wheels集合中存放了w1對象的引用。
b.getWheels().add(w1);
7-2
3. w1=null;
把w1變量置爲null,儘管w1變量不再引用Wheel 1對象,由於Bus對象的wheels集合還存放了Wheel 1對象的引用,因此Wheel 1對象並沒有結束生命週期。
4. w2=null;
把w2變量置爲null,由於Wheel 2對象不再被任何引用變量引用,因此該對象結束了生命週期。
5. 如圖7-3,當把b變量置爲null時,Bus對象不再被任何引用變量引用,因此結束了自己的生命週期。相應的,Wheel 1對象也不再被任何引用變量引用,也結束了自身的生命週期。
b=null;
7-3