在Java中,main()
方法的哪个声明有效?
我们通常使用public static void main(String[] arr){}
,但是我想知道的是:main()
方法可以声明为final吗?
final public static void main(String[] arr) {
//...
}
答案 0 :(得分:11)
是的,您可以标记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
对象的视图缩小为A
对象,该怎么办:
A bAsA = new B();
bAsA.main(null); // "Hello from A"
这可能令人惊讶。因为通常,它将从实际实例中获取方法,该实例将为B
。但这仅在您实际上是覆盖方法的情况下适用,而static
方法绝不会这样。
将main
标记为final
将导致没有子类能够隐藏您的方法。也就是说,B
将不再能够声明方法main
(具有相同的签名)。上面的代码将无法编译。
答案 1 :(得分:5)
简短的回答是。
您可以将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");
}
}
输出:无法覆盖Parent的最终方法。
但是您可以在子类主方法中声明最终方法。
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");
}
}
输出:
父母
孩子
答案 2 :(得分:0)
JLS中没有这样的限制,尽管我希望这样做是很简单的,所以修饰符的组合是没有意义的(在几乎所有情况下,如@Zabuza所述)。实际上,应用修饰符只有3个限制
我
如果出现相同的关键字,则是编译时错误 多次作为方法声明的修饰符,或 如果一个方法声明具有多个访问权 修饰符
public
,protected
和private
II
如果方法声明 包含关键字
abstract
也包含以下任意一项 关键字private
,static
,final
,native
,strictfp
或synchronized
。
III
如果方法声明 包含关键字
native
也包含strictfp
。