为啥我们允许在 java 中有一个最终的 main 方法?

Posted

技术标签:

【中文标题】为啥我们允许在 java 中有一个最终的 main 方法?【英文标题】:Why are we allowed to have a final main method in java?为什么我们允许在 java 中有一个最终的 main 方法? 【发布时间】:2014-11-20 11:27:36 【问题描述】:

谁能告诉我在java中将main方法设为final的用途。

虽然这在java中是允许的

public static final void main(String[] args)   




我认为将其定为最终版本没有任何用处。无论如何它是静态的,所以我们不能覆盖它。

【问题讨论】:

除非你将这个main方法用于启动你的应用程序之外的任何事情,否则绝对没有理由让它final 【参考方案1】:

final 添加到静态方法实际上可以产生影响。考虑以下代码:

class A 
    public static void main(String[] args) 
        System.out.println("A");
    


class B extends A 
    public static void main(String[] args) 
        System.out.println("B");
    


class C extends B 


public class Test 
    public static void main(String[] args) 
        C.main(args);  // Will invoke B.main
    

final 添加到A.main 可以防止意外隐藏A.main。换句话说,将final 添加到A.main 可以保证B.main 是不允许的,因此C.main 会打印"A",而不是例如"B"

为什么我们允许在 java 中有一个 final 的 main 方法?

除了上述极端情况之外,将final 添加到静态方法并没有太大区别,因此我认为添加禁止它的规则没有什么意义。

更多信息在这里:Behaviour of final static method

【讨论】:

final 将阻止隐藏 static 方法。 我尝试将 final 添加到 A 的 main 方法中,该类现在在 B 类中出现编译错误 - 无法从 A 覆盖 final 方法。我正在使用 Java 1.7。这个答案有效吗? @gyan,我不关注你。你认为哪一部分无效? 由于该错误,我无法验证您的观点 - 因此 C.main 实际上打印的是“A”而不是“B”。 如果将final 添加到A.main,则不能有B.main,这确保C.main 实际上会打印"A"。我已经稍微改写了答案以澄清。我不认为答案是无效的。

以上是关于为啥我们允许在 java 中有一个最终的 main 方法?的主要内容,如果未能解决你的问题,请参考以下文章

java中为啥要把main方法定义为一个static方法

为啥接口方法不能是“静态的”和“最终的”?

为啥 main 应该出现在 Java 类中? [复制]

C:为啥指针地址在函数中设置为空,而在main中有一个非空地址? [复制]

为啥我们在 Java 中有退出代码?

为啥Java允许我们编译一个名称与文件名不同的类?