【问题标题】:What is the role of the class in which the main method is wrapped?封装了main方法的类的作用是什么?
【发布时间】:2019-05-20 17:45:22
【问题描述】:

正如我们所知,main 方法是 java 程序的入口点,如以下资源中所述:

Why main() method is needed in java main class?

Why should main be present in a Java class? [duplicate]

如果是这种情况,如果main 方法是入口点,为什么我们需要在类中包装main 方法?

包裹main方法的class的作用是什么?

【问题讨论】:

    标签: java jvm main


    【解决方案1】:

    所有代码都位于.class 文件中,虽然此方法可能会产生异常,但这样做会增加产生此类异常的复杂性,而没有太大改进。

    由于您需要将代码放在.class 文件中,并且每个文件中都有一个与文件同名的公共classinterfaceenuminterface,因此您仍然需要在代码中声明文件名的某种方式。例如

    代替

    class Main {
        public static void main(String... args) { }
    }
    

    你可以拥有

    enum Main { ;
        public static void main(String... args) { }
    }
    

    interface Main {
        static void main(String... args) { }
    }
    

    但您需要将main 包装在与文件名匹配的名称中。

    【讨论】:

    • 你的回答是概括的,不清楚,能不能再清楚一点?
    • @SunnyKhan 我已经添加了更多细节,但我不确定你的疑问是什么,你能澄清你的担忧吗?
    • 你的答案看起来是我的。现在清楚了。谢谢楼主:)
    【解决方案2】:

    因为与其他语言相比,Java 中没有函数

    Java 只知道方法

    区别:方法与类绑定,函数则没有。

    因此,为了有一个 first 方法开始,那个东西仍然是一个方法并且需要一个封闭类。

    换句话说:在java中,给一段代码一个name的唯一方法就是把它变成一个方法。 (你真的希望你的“起点”有一个名字)并且方法需要进入一个类,这在查看 Java 语言规范(第 8.2 章,class members)时是隐含的。

    【讨论】:

      【解决方案3】:

      对于 Java VM,类文件是交付可执行 Java 代码的唯一方法,而 Java 库只是包含类文件的容器的变体。

      创建 Java 时,源级 Java 类和类文件之间存在直接映射,因此生成此类包含可执行代码的类文件的唯一方法是声明一个类。

      现在,这种关系并不那么严格,Java 语言的非类工件可能会导致类文件的生成,例如包注释或模块声明,此外,类可能由运行时生成,例如 lambda 表达式。

      因此,原则上,可能会有一种新的语言结构允许定义一个独立的 main 方法而无需类声明,该方法在后台编译为类文件。但由于一个典型的应用程序只有一个入口点(并且没有命名的托管类,定义多个的可能性无论如何都会消失),因此创建新的语言结构是不合理的。

      【讨论】:

      • 这就是为什么我们使用相同名称的public class 用于`同一个java 文件` 或same file name 用于具有main 方法的public class
      • Java 语言要求public 顶级类的java 文件名与类名匹配。但是你也可以运行非public 类(main 方法必须是public)或嵌套​​类。但是使用public 顶级类是一个很好的约定。
      【解决方案4】:

      在 Java 中,没有封闭类型就没有方法。您需要一个类、一个接口、一个枚举等才能声明和/或实现一个方法。这就是它的工作原理。

      即使在启动 Java 程序时,也要指定包含 main 方法的类的名称。你不只是运行任意语句。

      换句话说,它与程序结构有关,而不是与主要方法周围的类所扮演的特定角色有关。在最近的 Java 版本中,您甚至可以使用接口而不是类。

      【讨论】:

      • Even when you start a Java program, you specify the name of the class containing the main method. You don't just run arbitrary statements,所以,这就是为什么我们使用相同名称的public class 用于`同一个java文件`或same file name 用于具有main 方法的public class
      • 没有。您可以拥有一个与包含 .java 文件的类不同的名称(只要它不是公开的)。 Java 将为它创建一个单独的.class 文件,因此它会知道在哪里可以找到该类。
      • 您不需要指定主类。例如。您可以使用-jar 选项运行jar 文件,或者从Java 9 开始,您可以运行模块,从Java 11 开始,您甚至可以运行源代码文件。当然,还有一个类在幕后持有main 方法。
      • 哦,你的意思是当执行的class文件没有任何main方法时,内部仍然有一个main方法内部分配?
      • @ernest_k 是的,这就是我所说的“仍然有一个类在幕后持有main 方法”。只是这个类比不再适用,因为只有程序作者需要处理主类,而启动程序的用户不需要知道它。
      猜你喜欢
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多