为什么在有静态块的情况下还需要主方法

8

有人问了我一个问题。我认为主方法需要接受命令行参数作为方法参数。

除此之外,还有其他关于 public static void main(String args[]) 方法的论据吗?

5个回答

12
  • 它使得测试主方法成为可能
  • 它使得从其他类中调用主方法成为可能
  • 它使得可以多次调用主方法,而类型初始化仅会发生一次
  • 它使得可以创建一个包含主方法的类的实例而不运行程序。

考虑到"main"类的类型初始化会阻塞直到应用程序结束是令人憎恶的。

我们能应对吗?我敢说可以。但我认为我最终总会写出:

public class EntryPoint
{
    static
    {
        // Workaround for entry points being static initializers
        String[] arguments = getArgumentsHoweverThatHappens();
        RealEntryPoint.execute(arguments);
    }
}

... 而且没有其他东西会影响 EntryPoint


这些参数对于“静态块 vs 方法”比较是否通用?main()方法有什么特别之处? - Nishan
@Nishan:嗯,你期望main方法可能执行很长时间...而类型初始化器通常应该快速、不会抛出异常等等。 - Jon Skeet
@Nishan:你谈论了关于主方法的“辩护”参数 - 这些观点不足够吗? - Jon Skeet
它还定义了从操作系统运行的程序的典型接口,它接受一个字符串数组(命令行参数)并返回一个整数(状态代码以指示正确终止或错误类型)。 - user2219808

9

静态初始化程序和主方法有不同的意图。主方法的目的是仅在JVM以包含类作为主类调用时(或直接由代码调用)被调用。静态初始化程序的目的是执行类初始化。初始化程序总是会运行,但可能存在未运行的主方法。


8

除了以上所述,需要main(而不是静态块的特性)的原因是您的应用程序需要一个起点。也就是说,当您执行应用程序时,会向JVM传递数十个类,JVM需要知道首先调用哪种方法才能启动和执行您的应用程序。您需要声明应用程序的起始点,因为JVM无法猜测它。(对我的英语不好抱歉)


5

静态块是在相应的类被加载时运行一次。然而,main()是程序的入口点,正如Jon所说,它可以被多次调用。


1
大多数是因为C语言的缘故。
如果任何公共静态方法都可以成为入口点,而不仅仅是“main”,那会很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接