Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态对象中非静态变量的范围_Java_Static_Abstract - Fatal编程技术网

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;