课程完成后,静态变量变为空

时间:2017-03-17 10:36:40

标签: java static static-variables

我有三个班级

  1. StaticHolder.java - 包含静态变量。
  2. StaticInitializer.java - 仅负责通过静态方法初始化变量。
  3. Application.java - 通过getter方法检索静态变量值。
  4. 我认为在JVM中初始化一次静态变量不会发生,直到我们停止JVM。所以我调用了一次StaticInitializer来进行初始化。并且厌倦了从另一个无效的类中返回null并返回null。谁能解释为什么。在此先感谢。

    public class StaticHolder {
        private static String hello;
    
        public static void ini() {
            hello = "Hello World";
        }
    
        public static String getHello() {
            return hello;
        }
    
        public static void setHello(String hello) {
            StaticHolder.hello = hello;
        }
    }
    
    class StaticInitializer {
        public static void main(String[] args) {
            StaticHolder.ini();
            while (true) {
                Thread.sleep(1000);
            }
        }
    }
    
    public class Application {
        public static void main(String[] args) {
            System.out.println(StaticHolder.getHello());
        }
    }
    

3 个答案:

答案 0 :(得分:2)

static并不意味着这个值永远存在!

它只是当前java会话的

在命令行中调用java命令会启动一个新的java会话,其中值需要再次初始化。

  

实际上我有一个守护程序线程,它执行初始化并保持活动状态。而且我有另一个独立的java程序试图获取值。

我不知道其他代码涉及我的猜测是你没有建立进程间通信

你最简单的方式" deamon"打开一个服务器套接字和你的独立java程序"连接到它通过它查询所需的数据。

答案 1 :(得分:1)

因此,只有一个main方法可以作为每个JVM运行的整个应用程序的入口点执行。

执行JVM时,您可以指定在开始时必须加载哪个类。 Classloader负责加载该类,然后JVM可以执行唯一的public static void main(String[] args)方法。

在Java中,您需要至少有一个类具有名为main的公共静态方法。我建议阅读此post以了解它为什么是公共静态。

  

Java Classloader是Java运行时环境的一部分   将Java类动态加载到Java虚拟机中。   通常只按需加载类。

回到你的问题,假设当Application.main正在运行时无法执行StaticHolder.init(),我建议以这种方式改变你的主要内容:

public class Application {
    public static void main(String[] args) {
        StaticHolder.init();
        System.out.println(StaticHolder.getHello());
    }
}

或以这种方式更改StaticHolder并移除init

public class StaticHolder {
    private static String hello;

    static {
        hello = "Hello World";
    }

    public static String getHello() {
        return hello;
    }

    public static void setHello(String hello) {
        StaticHolder.hello = hello;
    }
}

另一方面,为了清楚,如果你运行StaticInitializer.main这对Application.main执行没有影响。

答案 2 :(得分:0)

在你的程序中,当第一次执行StaticInitializer的main方法时,一个名为hello的字符串被初始化。并且当调用ini()方法时,将值'Hello world'分配给hello。然后jvm存在main方法,然后停止工作。再次,当我们编译应用程序类而不是前一个hello变量时,会创建一个没有赋值(null值)的新hello字符串变量。这就是你输出null的原因。谢谢。