Can Java';是否将s main()方法声明为final?

Can Java';是否将s main()方法声明为final?,java,Java,在Java中,main()方法的哪个声明有效? 我们通常使用publicstaticvoidmain(String[]arr){},但我想知道的是:main()方法是否可以声明为final final public static void main(String[] arr) { //... } 简而言之,答案是肯定的 您可以将main方法声明为final。没有任何编译错误 public class Car { public final static void main(St

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

final public static void main(String[] arr) {
    //...
}
简而言之,答案是肯定的


您可以将main方法声明为final。没有任何编译错误

public class Car {
    public final static void main(String[] args) throws Exception {
        System.out.println("yes it works!");
    }
}
输出

是的,它能工作

但当我们使用继承概念时。我们不能将main方法声明为
final
。如果它是父类

public class Parent {
    public final static void main(String[] args) throws Exception {
        System.out.println("Parent");
    }
}

class Child extends Parent {
    public static void main(String[] args) throws Exception {
        System.out.println("Child");
    }
}
输出:无法从父级重写最终方法

但是您可以在子类main方法中声明最后一个方法

public class Parent {
    public static void main(String[] args) throws Exception {
        System.out.println("Parent");
    }
}

class Child extends Parent {
    public final static void main(String[] args) throws Exception {
        System.out.println("Child");
    }
}
输出:
父级
子级


是的,您可以标记
main
final

虽然这是可能的,但它不是真正有意义的<无法覆盖代码>最终方法。但是静态方法无论如何都不行,因为它们在扩展时不会被继承


躲藏 但是,当通过在扩展类中引入同名的方法而实际隐藏时,它会产生影响。看

这是一个人为的例子:

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
对象的视图缩小为
a
对象,该怎么办

A bAsA = new B();
bAsA.main(null); // "Hello from A"
这可能令人惊讶。因为,通常情况下,它将从实际实例中获取方法,即
B
。但这只适用于实际重写方法的情况,而
static
方法从来都不是这种情况


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

在中没有这样的限制,尽管我预计这是因为这样的修饰符组合毫无意义(在几乎所有情况下,正如@Zabuza所指出的)。事实上,应用修改器只有3个限制

如果出现相同的关键字,则为编译时错误 多次作为方法声明的修饰符,或 如果一个方法声明具有多个 修饰符
公共
受保护
私有

二,

如果方法声明 包含关键字
abstract
也包含以下任何一项 关键词
private
static
final
native
strictfp
,或
已同步

三,

如果方法声明 包含关键字
native
还包含
strictfp


你们试过了吗?编译器说是的,你们也可以使用vararg
main(String…args)
,或者让它抛出任何异常。但这并不是完全没有意义,它确实有效果。子类不能再声明这样的方法(更不用说重写了)。所以你可以锁定一个方法签名。我承认这是一个很少有用的工具。@Zabuza确实没有考虑过这种用法。