java - Java 的 main() 方法可以声明为 final 吗?

标签 java

在 Java 中,main() 方法的哪个声明是有效的? 我们常用public static void main(String[] arr){},但我想知道的是:main()方法可以声明为final吗?

final public static void main(String[] arr) {
    //...
}

最佳答案

是的,你可以标记main final

虽然有可能,但它并没有真正的意义final 方法不能被覆盖。但是静态方法无论如何都不能,因为它们在扩展时不会被继承。


隐藏

但是,通过在扩展类中引入同名方法来实际隐藏时,它会产生效果。参见 Behaviour of final static method .

一个人为的例子:

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

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

假设您手动调用这些方法:

A.main(null);  // "Hello from A"
B.main(null);  // "Hello from B"

请注意,Java 还允许从实例调用 static 方法:

A a = new A();
a.main(null);  // "Hello from A"

B b = new B();
b.main(null);  // "Hello from B"

但是,如果将 B 对象的 View 缩减为 A 对象会怎样:

A bAsA = new B();
bAsA.main(null); // "Hello from A"

这可能令人惊讶。因为,通常,它会从实际实例中获取方法,即 B。但这仅适用于您实际覆盖方法的情况,而 static 方法绝不会出现这种情况。

main 标记为 final 将导致不再有子类能够隐藏您的方法。也就是说,B 将无法再声明方法 main(具有相同的签名)。上面的代码将无法编译。

关于java - Java 的 main() 方法可以声明为 final 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54620109/

相关文章:

java - 通过 Firestore 仅存储当前登录用户的数据

java - 使用 Runtime.getRuntime().exec() 启动的 Java 程序的输出

java - 将 Arraylist 从 Servlet 返回到 DAO 返回到 Servlet,然后返回到 Jsp

java - 使用 java 解析 xml 字符串和修剪特定标签空间的最佳方法

java - 从 IntelliJ 2019 中运行 Maven 命令( "Lifecycle"目标除外)

java - 如何获取相对于窗口而不是屏幕的鼠标坐标?

java - 带有 REPLACE_EXISTING 选项的 FileAlreadyExistsException

java - 如何创建创建列表的方法的通用版本

java - Map.put 和 Map.putAll 方法之间的区别?

java - 通过套接字接收的字符串在 python 中不进行比较