Java 静态对象中非静态变量的范围
我无法理解遇到的一段代码 下面是一段类似的代码:Java 静态对象中非静态变量的范围,java,static,abstract,Java,Static,Abstract,我无法理解遇到的一段代码 下面是一段类似的代码: class GrandParent { private Map<String, String> map = new HashMap<String, String>(); protected void insertString(String key, String value) { map.put(key, value);
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);
}
}
}
发现地图包含了所有的20个元素。有人能解释这背后的原因吗?我想我错过了一些非常基本的东西
我想我错过了一些非常基本的东西
非常基本的事情。静态变量,或者说,类级别的变量在类的所有实例之间共享。因此,您只有一个类级别变量的实例:
private static AbstractParent parent1;
对AbstractParent.getParent1Instance()
的每个请求都会返回该实例,并且始终返回相同的实例
您在main中的方法级别声明:
AbstractParent parent1
不更改任何内容,因为它位于完全不同的类AbstractAndStaticTest中的完全方法本地,因此parent1=null只使AbstractParent实例符合垃圾收集的条件,而不使其符合类对象和类级实例的条件,因为它们永远不符合GC的条件。因为您的代码是:
AbstractParent parent2 = AbstractParent.getParent1Instance();
parent2.populateStringMapNext();
parent2
应该在您的功能中包含所有20项
同时,由于parent1
的定义如下:
AbstractParent parent1 = AbstractParent.getParent1Instance();
parent1.populateStringMapInitial();
parent1
将具有与您定义的初始设置相同的10项
当你这样做的时候:
parent1 = null;
那里什么都没有
您在这里的确切查询是什么?我的问题是“map”变量的范围是什么。可以看出,“地图”是祖父母的私人物品,我们正在创建一个Child对象,因此,地图不应该在Child的范围内。事实并非如此,是什么让你产生了相反的想法?上面的模式是单例模式<代码>静态getParent1Instance()只会创建一次新实例,后续请求将返回相同的对象。因此,您最终拥有20个元素。
parent1 = null;