【问题标题】: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

标签: java static 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"。我已经稍微改写了答案以澄清。我不认为答案是无效的。
猜你喜欢
  • 1970-01-01
  • 2021-02-02
  • 2012-07-10
  • 2016-11-16
  • 2015-07-12
  • 2018-05-09
  • 2011-08-29
  • 2011-04-09
相关资源
最近更新 更多