为啥我们允许在 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 方法?的主要内容,如果未能解决你的问题,请参考以下文章