当应用程序通过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