Java中main方法被定义为final的原因是什么?

7

我在一份认证考试中看到了这段代码:

public class SimpleClass 
{
    int num;
    final static void main(final String args[])
    {
        String s1="new";
        String s2="String";
        String s3="Creation";
        System.out.println(s1+s2+s3);
    }
}

我知道final方法是无法被覆盖的。我也知道如果修改了main方法的常规签名,JVM会将其视为普通方法,而不是main()

然而,给我的选项是:

1>  Code  won't  compile
2>  Code  will  throw  an  exception
3>  will  print  newStringCreation.

无法在eclipse IDE上运行该程序。有人能解释一下应该选择哪个答案以及为什么吗?

好的,让我这样提问-当我执行我的程序时,会发生什么? 以上3个选项中应该选择哪一个?


3
恶劣的问题。 final 不应该有影响。但是 main 方法也不是公共的,这让我感到担忧。 - Thilo
是的,这段代码可以编译通过,但它无法运行。 - Davio
3
好的,如果你使用 java SimpleClass 来启动程序的话,“run”的定义是什么?根据你之前提到的,由于确实没有 main() 方法可以运行,程序会抛出异常。此外,你无法以任何方式覆盖静态方法,因此将其声明为 final 是多余的。 - fge
@fge声明静态方法并不是多余的。如果您在超类中未将它们声明为final,则可以在子类中隐藏静态方法。 - Daniel
1
你尝试过自己编译和运行吗?你说的“这个程序无法在Eclipse IDE上运行”是什么意思?当你尝试运行它时会发生什么?你尝试在命令行上运行它了吗? - Code-Apprentice
4个回答

11

final static void main无法运行,因为main不是public。

public final static void main可以正常工作。

至少在我的Eclipse IDE上是这样的行为。


8
代码将会编译通过,但是会抛出一个运行时异常,"main 方法不是 public"。主方法必须是 public,因为它需要被 JVM 调用,而 JVM 处于包的范围之外,因此需要访问限定符-public。如果在 Eclipse 中无法运行它,请尝试使用记事本将文件保存为 filename.java 的古老方法。进入 cmd 并到达文件位置... 如果在桌面上,请使用 cd desktop!使用以下命令运行文件-
javac filename.java

java filename

您会看到我之前提到的所需的运行时异常。

我同意Stefan的回答,由于无法在评论中给出详细描述,因此我单独回答了。@Gpar,请尝试这种方法,你可能会找到你要找的东西 :) - hchawla
谢谢@hchawla,我尝试了你的建议,但在cmd中出现了一个错误,称为“javac未被识别为内部或外部命令”。请告诉我接下来该怎么做? - Gpar
当你执行javac命令时,你是否在cmd中与文件相同的目录下? - hchawla
@Gpar,如果有任何错误的话,这个链接应该会对你有所帮助:http://docs.oracle.com/javase/tutorial/getStarted/problems/index.html - hchawla

4

main方法必须从外部可访问。因此,在您的情况下,应用程序将编译但在运行时引发执行异常。


2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Gpar

-1

你有主方法,但由于修饰符是final,JVM将无法运行程序的主方法。你不会看到任何编译错误。

当你将修饰符从final更改为public时,你可以在eclipse中运行程序。


2
主方法可以是final的。它应该是public final的。 - Reetika

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