【问题标题】:How do Java programs run without defining the main method?Java程序如何在不定义main方法的情况下运行?
【发布时间】:2011-11-27 07:27:14
【问题描述】:

我查看了一些 Java 源代码,发现 main 方法没有定义。

Java 不知道从何开始,如何编译源代码?

【问题讨论】:

    标签: java methods main


    【解决方案1】:

    main 方法仅在 Java 虚拟机执行您的代码时使用。没有main 方法,代码无法执行,但仍然可以编译。

    编译代码时,通常在命令行上指定一组文件,例如

    javac MyClass1.java MyClass2.java
    

    Java 编译器 (javac) 会检查您传递给它的每个类并将其编译为 .class 文件。

    Java 源代码可能缺少main 方法的一个原因是因为它被设计为用作库,而不是被执行。

    您可能会觉得有趣:虽然 Java 编译器编译的源代码不需要 main 方法,但 source code for the Java compiler itself 确实有 main 方法。

    【讨论】:

      【解决方案2】:

      运行和编译是有区别的。 Java 代码可以增量编译。你只需要一个main运行代码。 Java“知道从哪里开始”,因为编译器足够聪明,可以在编译时安排所有依赖项。

      确实,如果您在某种标准容器中构建 Web 应用程序,您的代码可能没有 main 方法。容器可以,但您只需编写插件即可。

      【讨论】:

        【解决方案3】:

        Java 如何在不知道去哪里的情况下编译运行你的源代码 开始?

        我假设你的意思是运行(而不是编译),因为你不需要 main() 来编译。在这种情况下,显式声明的 main() 方法只是运行程序的一种方式。 您可以使用一些框架来执行您的代码。他们有 main() (仅谈论控制台应用程序)并要求您仅声明一个入口点。例如,这就是您运行单元测试的方式。

        【讨论】:

          【解决方案4】:

          您编写的每个 Java 类都不打算作为运行的入口点,这就是原因。我会说这是规则而不是例外。

          【讨论】:

            【解决方案5】:

            // 仅适用于 java 1.6 或更低版本

            public class Test{   
                // this is static block
            
                static{
                    System.out.println("This is static block");  
                }
            }
            

            在 Java 中(运行时):

            1. 所有静态成员均已识别。
            2. 所有变量和方法都已初始化
            3. 静态块被执行

            【讨论】:

            • '静态成员被识别'是没有意义的; '所有变量......都已初始化'为假;并且“方法已初始化”是没有意义的。在 Java 6 和更早的版本中,也可能在以后的版本中,给定的输出后面会跟着一个 java.lang.NoSuchMethodError 代表 main()
            【解决方案6】:

            是的,我们可以在没有main方法的情况下运行java程序,为此我们将使用静态函数

            以下是代码:

            class Vishal
            {
                static
                {
                    System.out.println("Hi look program is running without main() method");
                }
            }
            

            这将输出“Hi look program is running without main() method”

            【讨论】:

            • 后跟java.lang.NoSuchMethodError
            【解决方案7】:
            public class Test{   
                // this is static block
            
                static{
                    System.out.println("This is static block");  
                    System.exit(0);
                }
            }
            

            这将在 JDK 1.6 或更早版本中运行良好。在 1.7 及更高版本中,必须包含 main() 函数。

            【讨论】:

              【解决方案8】:

              我们可以在没有 main 方法的情况下编译程序。实际运行程序与编译程序不同。大多数库不包含 main 方法。所以对于编译来说,程序是否包含main方法是没有问题的。

              【讨论】:

                【解决方案9】:
                package com.test;
                
                public class Test {
                    static {
                        System.out.println("HOLAAAA");
                        System.exit(1);
                    }
                }
                
                //by coco
                //Command line:
                //java -Djava.security.manager=com.test.Test
                

                【讨论】:

                • 嗨 coco,欢迎来到 Stack Overflow。只是对您的第一篇文章的提示:请考虑添加一些解释性文本,说明其工作原理和原因,最好参考该方法的文档。
                【解决方案10】:

                其中一种方法是静态块,但在以前版本的 JDK 中不在 JDK 1.7 中。

                class A3{  
                  static{  
                  System.out.println("static block is invoked");  
                  System.exit(0);  
                  }  
                }  
                

                【讨论】:

                  【解决方案11】:

                  如果你不想使用静态块,可以按照以下方式完成

                  public class NoMain {
                  
                      private static final int STATUS = getStatus();
                  
                      private static int getStatus() {
                          System.out.println("Hello World!!");
                          System.exit(0);
                          return 0;
                      }
                  
                  }
                  

                  但是,请注意这是针对 Java 6 版本的。这似乎不适用于 Java 7 及更高版本

                  【讨论】:

                  • '它在 Java 7 中不起作用,据说在 Java 8 中支持'是没有意义的。
                  【解决方案12】:

                  这将在没有任何错误且没有 main() 方法的情况下执行

                  abstract class hello extends javafx.application.Application
                  {
                      static 
                      {
                      System.out.println("without main method");
                      System.exit(0);
                      }
                  }
                  

                  【讨论】:

                    【解决方案13】:

                    是的,我们可以在没有 Main 函数的情况下编译和执行 java 程序。取而代之的是,我们可以使用静态块来编译和执行程序。仅支持以前版本的 java。但是现在不支持了...

                    【讨论】:

                    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
                    猜你喜欢
                    • 2015-07-24
                    • 2012-01-26
                    • 2018-04-18
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-07-29
                    • 1970-01-01
                    • 2021-10-24
                    • 2014-10-26
                    相关资源
                    最近更新 更多