我有三个班级
我认为在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());
}
}
答案 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的原因。谢谢。