class 完成后静态变量变为空
Static Variable becomes null after class completed
我有三个 classes
- StaticHolder.java - 它包含一个静态变量。
- StaticInitializer.java - 只负责通过静态方法初始化变量。
- 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 作为输出。谢谢你。
我有三个 classes
- StaticHolder.java - 它包含一个静态变量。
- StaticInitializer.java - 只负责通过静态方法初始化变量。
- 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 作为输出。谢谢你。