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

时间:2019-02-10 19:23:15

标签: java

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

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

3 个答案:

答案 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个限制

  

如果出现相同的关键字,则是编译时错误   多次作为方法声明的修饰符,或   如果一个方法声明具有多个访问权   修饰符publicprotectedprivate

II

  

如果方法声明   包含关键字abstract也包含以下任意一项   关键字privatestaticfinalnativestrictfp或   synchronized

III

  

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