我无法理解我遇到的一段代码。
以下是一段类似的代码:
class GrandParent
{
private Map<String, String> map = new HashMap<String, String>();
protected void insertString(String key, String value)
{
map.put(key, value);
}
}
abstract class AbstractParent extends GrandParent
{
private static AbstractParent parent1;
public static AbstractParent getParent1Instance()
{
if(parent1 == null)
{
parent1 = new ImplementingChild();
}
return parent1;
}
public void populateStringMapInitial()
{
for(int count = 0; count < 10; count++)
{
insertString("" + count, "parent count value = "+count);
}
}
public void populateStringMapNext()
{
for(int count = 10; count < 20; count++)
{
insertString("" + count, "parent count value = "+count);
}
}
}
class ImplementingChild extends AbstractParent
{
public void populateStringMapInitial()
{
for(int count = 0; count < 10; count++)
{
insertString("" + count, "child count value = "+count);
}
}
public void populateStringMapNext()
{
for(int count = 10; count < 20; count++)
{
insertString("" + count, "child count value = "+count);
}
}
}
如果我通过孩子创建 AbstractParent 的静态实例,“地图”变量的范围是什么?Map 是 GrandParent 私有的(即在对象级别),而 AbstractParent 的对象是静态的(即在类级别)。即使存在 AbstractParent(Child) 实例,“map”变量是否有资格进行垃圾收集?
其次,这种设计背后的原因可能是什么?
我测试了上述代码以对 AbstractParent 的静态实例进行非静态引用,如下例所示:
class AbstractAndStaticTest {
public static void main(String[] args)
{
AbstractParent parent1 = AbstractParent.getParent1Instance();
parent1.populateStringMapInitial();
parent1 = null;
AbstractParent parent2 = AbstractParent.getParent1Instance();
parent2.populateStringMapNext();
System.out.println();
}
}
并发现地图包含所有 20 个元素。谁能解释这背后的原因?我想我在这里遗漏了一些非常基本的东西。