Java 类完成后,静态变量变为null
我有三节课Java 类完成后,静态变量变为null,java,static,static-variables,Java,Static,Static Variables,我有三节课 java—它保存一个静态变量 java-仅负责通过静态方法初始化变量 java-通过getter方法检索静态变量值 我认为在JVM中初始化一次静态变量直到我们停止JVM时才会进行。所以我调用了一次ran StaticInitializer,它将进行初始化。并且厌倦了从另一个不工作并返回null的类访问它的值。谁能解释一下原因吗。提前谢谢 public class StaticHolder { private static String hello; public s
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时,可以指定在开始时必须加载哪个类。类加载器负责加载该类,然后JVM只能执行一个publicstaticvoidmain(String[]args)
方法
在Java中,至少需要一个名为main
的公共静态方法类。我建议读一下这篇文章来理解为什么它是公共静态的
是Java运行时环境的一部分
将Java类动态加载到Java虚拟机中。
通常,类只在需要时加载
因此,回到您的问题,考虑到运行Application.main
时无法执行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
执行没有影响。因此,对于每个JVM运行,只有一个main
方法可以作为整个应用程序的入口点执行
执行JVM时,可以指定在开始时必须加载哪个类。类加载器负责加载该类,然后JVM只能执行一个publicstaticvoidmain(String[]args)
方法
在Java中,至少需要一个名为main
的公共静态方法类。我建议读一下这篇文章来理解为什么它是公共静态的
是Java运行时环境的一部分
将Java类动态加载到Java虚拟机中。
通常,类只在需要时加载
因此,回到您的问题,考虑到运行Application.main
时无法执行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
这对应用程序没有影响。main
执行。static
并不意味着这个值永远存在
它仅适用于当前java会话
在命令行中调用java
命令将启动一个新的java会话,需要再次初始化该值
实际上,我有一个守护进程线程,它进行初始化并保持活动状态。我还有另一个独立的java程序,它试图获取值 在不知道涉及其他代码的情况下,我的问题是您没有建立进程间通信
最简单的方法是“deamon”打开服务器套接字,然后“独立java程序”连接到它,并通过它查询所需的数据。
静态
并不意味着该值永远存在
它仅适用于当前java会话
在命令行中调用java
命令将启动一个新的java会话,需要再次初始化该值
实际上,我有一个守护进程线程,它进行初始化并保持活动状态。我还有另一个独立的java程序,它试图获取值 在不知道涉及其他代码的情况下,我的问题是您没有建立进程间通信
最简单的方法是“deamon”打开一个服务器套接字,您的“独立java程序”连接到它,并通过它查询所需的数据。在您的程序中,当第一次执行StaticInitializer的main方法时,名为hello的字符串被初始化。当调用ini()方法时,值“Hello world”被分配给Hello。然后jvm存在主方法,然后停止工作。同样,当我们编译应用程序类时,会创建一个新的hello字符串变量,而不是前面的hello变量,并且没有赋值(空值)。这就是为什么输出为null。谢谢 在程序中,当第一次执行StaticInitializer的main方法时,名为hello的字符串被初始化。当调用ini()方法时,值“Hello world”被分配给Hello。然后jvm存在主方法,然后停止工作。同样,当我们编译应用程序类时,会创建一个新的hello字符串变量,而不是前面的hello变量,并且没有赋值(空值)。这就是为什么输出为null。谢谢 您只能运行一个main方法。为什么您认为两个独立的
main
方法会在同一个JVM中运行?Java程序应该只有一个main
方法,所以调用StaticInitializer
或Application
,不是两者都有。@SomeJavaGuy我不太明白。但是我的机器上只有一个jvm实例在运行。@cgeek我想你是说一个java
安装,一个jvm
是执行java程序时执行java
程序的地方。当您调用第一个main->oneJVM
执行它并终止时,您调用第二个main
,另一个JVM
执行i