【问题标题】:Why main() method is needed in java main class为什么 java 主类中需要 main() 方法
【发布时间】:2023-03-27 11:28:01
【问题描述】:

我知道我们可以在没有main()方法的情况下成功编译和运行一个java程序,但是为什么我们仍然需要在java的主类中使用main()方法呢?

【问题讨论】:

  • "我知道我们可以在没有 main() 方法的情况下成功编译和运行一个 java 程序" ...不,你不能。
  • "这是进入 Java House/Architecture 的门。"所以问题会变成为什么门需要进入房子:)
  • @amit - 你只能compile 但不能运行没有main 方法的类文件。运行没有main方法的文件时会遇到错误Main method not found

标签: java


【解决方案1】:
  1. 要回答这个问题,我们需要了解出色的 Java 架构。
  2. 我们有 Java 源代码(.java 文件)
  3. 编译器检查错误并生成字节码作为.class文件
  4. 然后类加载器加载.class文件
  5. 之后 JVM 承担责任

    • a) JVM 加载静态块
    • b) 之后,JVM 中的解释器想要读取代码。在一堆代码中,JVM 的问题是从哪里开始阅读?

    • 回答:为了解决这个问题,我们提供了main 关键字作为 JVM 在此方法中开始执行的线索。

  6. 之后,Java 将通过处理操作系统和硬件来产生输出
  7. 我的回答够清楚吗?如有任何疑问,请发表评论。

【讨论】:

    【解决方案2】:

    引用 Java Language Specification (JLS) "A Java virtual machine starts execution by invoking the method main of some specified class, passing it a single argument, which is an array of strings"

    现在是main方法的典型定义,执行开始是

    public static void main(String[] args)
    

    public - 意思应该可以从任何地方访问

    static - 应该可以在没有实例的情况下静态访问(当 JVM 启动时,它没有包含 main 方法的类的实例,因此是静态的)。

    void - 返回无效。

    所以 main() 方法在 JVM 中被“硬编码”以告诉它它是一个起点。

    【讨论】:

      【解决方案3】:

      每个 Java 应用程序都必须包含一个 main 方法,其签名如下所示:

         public static void main(String[] args)
      

      如何调用主方法

      Java 语言中的 main 方法类似于 C 和 C++ 中的 main 函数。当 Java 解释器执行应用程序时(通过在应用程序的控制类上调用),它首先调用该类的 main 方法。然后 main 方法调用运行应用程序所需的所有其他方法。

      如果您尝试在没有 main 方法的类上调用 Java 解释器,解释器会拒绝编译您的程序并显示类似以下的错误消息:

       In class NoMain: void main(String argv[]) is not defined
      

      主要方法的参数

      从下面的代码 sn-p 可以看出,main 方法接受一个参数:String 类型的元素数组。

         public static void main(String[] args)
      

      此数组是运行时系统将信息传递给您的应用程序的机制。数组中的每个字符串称为命令行参数。命令行参数让用户无需重新编译即可影响应用程序的操作。例如,排序程序可能允许用户使用以下命令行参数指定数据按降序排序:

          -descending
      

      更多信息

      http://journals.ecs.soton.ac.uk/java/tutorial/getStarted/application/main.html

      【讨论】:

      • 这有效吗?主要而不是主要?
      【解决方案4】:

      main() 是应用程序的起点。当应用程序启动时,这个函数是首先从您的代码中评估的。它负责运行您的应用程序。

      【讨论】:

        【解决方案5】:

        您可以在没有main 方法的情况下编译任何Java 类,但是如果没有main() 方法,独立应用程序将无法运行*

        main 方法是定义为在应用程序启动时调用的方法。没有它,就没有地方开始运行。

        * 好吧,丑陋的黑客可以做到这一点,但那是作弊

        【讨论】:

        • 但我的问题仍然得到解答,我们可以对所有类型的活动使用静态块,然后使用这个 System.exit() 命令我们可以退出 JVM 寻找 main() 方法。我想问一下,除了main(),还有什么静态块不能做的吗?
        • 您打算如何让 JVM 仅使用静态块开始执行?没有办法执行这个类。
        • @mcfinnigan:嗯,基本上Java可以执行一个以某种方式标记的类的静态初始化,然后执行它的静态块。关键是当前的约定不同,恕我直言更合理。
        • @Vlad:在 JVM 中使用哪个入口点来执行此操作?我的理解是,您需要一个应用程序入口点才能实际生成 jvm。
        • @mcfinnigan:目前,你是对的。但是Java 编译器理论上 可以创建一个存根main,它只会引用 一些类。这种引用会触发静态初始化,进而启动“真正的”程序。
        【解决方案6】:

        当一个程序开始运行时,它必须从某个地方开始执行。那个地方叫main

        【讨论】:

        • 好吧,如果我使用静态块,然后通过 System.exit(1) 退出 JVM,那么我们这里不需要 main()。
        • @amit:您不能依赖静态块:它们的执行顺序取决于类实例化/引用顺序。那么如果在不同的类中有几个静态块,它们中的哪一个会先被执行呢?他们中的哪一个会被处决?
        猜你喜欢
        • 2011-07-10
        • 2012-06-02
        • 2010-10-14
        • 1970-01-01
        • 2013-09-08
        • 2012-12-28
        • 1970-01-01
        • 2014-11-07
        • 2013-07-14
        相关资源
        最近更新 更多