【发布时间】:2019-08-19 17:00:39
【问题描述】:
希望获得一些 Java 遵循的幕后内存引用和规则。
这是一个sn-p的代码。 基本上,此类用于实例化一些其他对象(MyOtherObject),之后对该对象的 doClose() 方法的引用被发送到 Vector。
如果创建了 3 个 MyOtherObject 对象,则 Vector 将有 3 个条目。
最终将调用一个进程,导致侦听器遍历 MyOtherObject 对象的 Vector 并为每个对象调用 doClose()。
目前代码显示
myOtherObject = new myOtherObject();
作为活动线。使用此行时,实际上将关闭 3 个 MyOtherObject 对象中的 1 个。
如果代码改为
MyOtherObject myOtherObject = new MyOtherObject();
然后 3 个 MyOtherObject 对象中的每一个都将调用其 doClose() 例程。
public class MyObject
{
MyOtherObject myOtherObject ;
public static MyObject getInstance()
{
:
:
:
return instance;
}
public void runThis ()
{
///MyOtherObject myOtherObject = new MyOtherObject(); //Works
myOtherObject = new myOtherObject(); //Only closes one
MyCustomObjectTracker customObjectTracker = new MyCustomObjectTracker()
{
@Override
public void closingMyWindows()
{
myOtherObject.doClose();
}
};
refernceToSomeOtherObject.addMyObjectTracker(customObjectTracker);
}
}
由于“工作”中的变量是本地的,以后将无法引用,Java 是否会在变量超出范围时将变量替换为实际的对象引用?
在只有 1 被关闭的“不工作”场景中,这是因为该变量是一个实例变量,并且当对 doClose() 对象进行引用时,它使用了 myOtherObject 变量中的任何引用doClose() 的执行时间?
基本上是在寻找这些对象在幕后被取消引用的内容/时间,以及是否有针对该行为的官方术语。
【问题讨论】:
标签: java memory dereference