Lets说我在实体类中有代码:
this.setCurrentState(new NormalState(this));
如果在正常状态类中,我将实体的状态切换为:
entity.setCurrentState(new HungryState(entity));
NormalState对象是垃圾收集事件,虽然它持有对仍处于活动状态的实体的引用或不会导致内存泄漏吗?
答案 0 :(得分:1)
Java的垃圾收集器会删除所有对它们没有任何引用的对象。如果调用setCurrentState
方法将存储的引用替换为NormalState
的实例,并且在整个VM中没有对该对象的另一个引用,则将其标记为{{1因此,它将被收集。
答案 1 :(得分:1)
垃圾收集器删除所有未使用的对象;如果你的NormalState
没有保存在变量中,也没有被代码使用,那么它将被垃圾收集。如果Entity
是唯一包含对它的引用的对象,NormalState
也将被垃圾收集。
例如,给定两个类A和B,其中A包含B,如下:
public class A {
B inner = new B();
public A(B in) {
inner = in;
}
}
在以下示例中, myB将被垃圾收集(当我们收集A
时):
public static void main(String[] args) {
B myB;
//setting a value with = returns the value
//myB = new B() -> myB
A firstObject = new A(myB = new B())
//bad coding practice, but the fastest way to clear variables
firstObject = null;
myB = null;
}
但是,以下内容不会垃圾收集myB,因为它仍然是一个引用:
public static void main(String[] args) {
B myB;
A firstObject = new A(myB = new B())
A secondObject = new A(myB);
//clear references. secondObject still has a reference to what was myB.
//the now unnamed B will not be collected until secondObject changes.
firstObject = null;
myB = null;
}
注意:尝试命名对象非常烦人;只要它有一个变量,就很容易说myB
,但即使你停止调用它myB
,它仍然存在于计算机中。我不知道该怎么称呼它,因为我在myB
时停止调用它myB = null;
。