Can Java';是否将s main()方法声明为final?
在Java中,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
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确实没有考虑过这种用法。