class 完成后静态变量变为空

Static Variable becomes null after class completed

我有三个 classes

  1. StaticHolder.java - 它包含一个静态变量。
  2. StaticInitializer.java - 只负责通过静态方法初始化变量。
  3. Application.java - 通过 getter 方法检索静态变量值。

我认为在 JVM 中初始化一次静态变量将不会继续,直到我们停止 JVM。所以我调用了一次 运行 StaticInitializer 来进行初始化。厌倦了从另一个不工作并返回 null 的 class 访问它的值。任何人都可以解释为什么。提前致谢。

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());
    }
}

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

当执行 JVM 时,您可以指定 class 必须在启动时加载。类加载器负责加载 class 然后 JVM 可以执行唯一的一个 public static void main(String[] args) 方法。

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

The Java Classloader is a part of the Java Runtime Environment that dynamically loads Java classes into the Java Virtual Machine. Usually classes are only loaded on demand.

所以回到你的问题,考虑到当Application.main是运行ning时没有办法执行StaticHolder.init(),我建议这样改变你的main:

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 执行没有影响,请明确。

static不代表这个值永远存在!

它仅适用于 当前 java 会话

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


Actually I have a daemon thread which does the initialization and stays alive.And I have another stand alone java program which tries to get the value.

在不知道涉及其他代码的情况下,我的猜测是您没有建立进程间通信

最简单的方法是您 "deamon" 打开一个 服务器套接字 并且您的 "stand alone java program" 连接到它并通过它查询所需的数据。

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