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

我有三节课

  • java—它保存一个静态变量
  • java-仅负责通过静态方法初始化变量
  • java-通过getter方法检索静态变量值
  • 我认为在JVM中初始化一次静态变量直到我们停止JVM时才会进行。所以我调用了一次ran StaticInitializer,它将进行初始化。并且厌倦了从另一个不工作并返回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());
        }
    }
    

    因此,对于每个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->one
    JVM
    执行它并终止时,您调用第二个
    main
    ,另一个
    JVM
    执行i