Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这里两次叫“main”?_Java_Static_Main - Fatal编程技术网

Java 为什么这里两次叫“main”?

Java 为什么这里两次叫“main”?,java,static,main,Java,Static,Main,这是我的密码: public class Test { static { main(null); } public static void main(String [] args) { System.out.println("done"); } } 我得到以下输出: done done 谁能解释一下原因吗?原因是main被调用了两次: 显式地,在类加载后立即从 隐式地,在程序启动后立即输入程序 如何解决这个问题?不要显式调用它,

这是我的密码:

public class Test
{
   static 
   {
      main(null);
   }
   public static void main(String [] args)
   {
      System.out.println("done");
   }
}
我得到以下输出:

done 
done

谁能解释一下原因吗?

原因是
main
被调用了两次:

  • 显式地,在类加载后立即从
  • 隐式地,在程序启动后立即输入程序

  • 如何解决这个问题?不要显式调用它,也不要重命名它,这样它就不会被自动调用。

    在首次加载类时,会调用类的静态块。这是第一次。第二个原因是您正在运行程序,然后调用main方法。

    因为

    • 当类
      Test
      加载到JVM中时,调用
      static{…}
      部分(它是一种静态构造函数)
    • 而执行开始时调用
      main
      方法

      • 你认为有什么不寻常之处?加载类时,
        static
        块执行一次(必须在执行
        main
        方法之前加载它。然后执行
        main
        方法本身

        查看此修改版本:

        public class Test {
            static {
                main(new String[]{"[done static]"});
            }
        
            public static void main(String[] args) {
                System.out.println(args.length > 0 ? args[0] : "[done]");
            }
        }
        
        它打印:

        [done static]
        [done]
        

        当虚拟机加载jar时,会自动调用main。因此,这是第一个“完成”,是Java程序的正常入口点

        编写第二个“Done”是因为您在静态类初始值设定项中显式调用它。添加到“Test”类的“static”部分将在虚拟机类装入器装入类后立即调用


        甚至应该在调用入口点Main之前调用静态初始值设定项中的一个,因为在调用入口点之前需要加载类。

        在调用
        Test.Main
        之前,JVM需要通过运行其静态初始值设定项来初始化
        Test
        类。此调用负责的第一次调用e> main()。初始化完成后,JVM再次调用
        main()
        ,最终生成您看到的输出。

        main由JVM自动调用。无需在静态部分调用它

        public class Test
        {
           public static void main(String [] args)
           {
              System.out.println("done");
           }
        }
        

        上面的代码应该是这样的。

        请阅读。无论您告诉我什么,我知道,但问题是,我们在静态中的main方法中传递null作为参数,它应该有一些字符串,因为您没有使用传递给main的参数。传递给main方法的内容无关紧要。它将被调用。我们是在静态块中的主方法中传递null作为参数,应该是stringI。我只是因为静态块中的主方法中存在null参数而感到困惑,请告诉我它是否会产生任何问题,因为主方法期望字符串类型为argument@saurabhRai:
        main
        methodexpected
        String
        arr是的,不是
        字符串
        null
        也不太正确,因为
        main
        方法总是由JVM提供参数数组-如果没有参数,这个数组是空的,但不是
        null