当前位置: 首页 > 知识库问答 >
问题:

为什么允许我们在Java中有一个最终的main方法?

栾和风
2023-03-14

谁能告诉我在java中使main方法成为final的用途。

public static final void main(String[] args) {  



}

共有1个答案

杜俊晤
2023-03-14

在静态方法中添加final实际上可以产生不同的效果。请考虑以下代码:

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

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

class C extends B {
}

public class Test {
    public static void main(String[] args) {
        C.main(args);  // Will invoke B.main
    }
}

final添加到a.main可以防止意外隐藏a.main。换句话说,将final添加到a.main可以保证不允许b.main,因此c.main打印“a”而不是例如“b”

为什么允许我们在Java中有一个最终的main方法?

除了上面的corner case之外,将final添加到静态方法中并没有太大的区别,所以我不认为添加一个不允许它的规则有什么大的意义。

更多信息可在此获得:最终静态方法的行为

 类似资料:
  • 问题内容: 为什么在Java 8中允许接口具有方法? 如下面的代码所述,它可以正常工作并正确产生输出。 目前它的行为就像一个类,我已经用main方法执行了。 我们为什么需要这个? 问题答案: 从Java 8开始,接口中允许使用静态方法。 main()是静态方法。 因此,在接口中允许main()。 我们 不需要 它,因为以前不允许这样做,但是我们幸存了下来。但是,根据定义,由于静态方法不是绑定到类的

  • 问题内容: Java 8最有用的功能之一是接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因): 提供实际的默认实现。例: 允许JDK API演进。例: 从API设计人员的角度来看,我希望能够在接口方法上使用其他修饰符,例如。在添加便捷方法时,这将很有用,以防止在实现类时“意外”覆盖: 如果已经上过课,以上是已经很普遍的做法: 现在,并且显然是相互矛盾的关键字,但是默认关键字本身并没有严

  • 我正在学习Spring Core认证,我对这个基于学习材料的问题的答案有一些疑问。 为什么不允许使用@Configuration注释最终类 为了证实这一论断,我的理由如下: 考虑下面的配置类: 乍一看,这种情况可能看起来很奇怪,因为第一个方法(帐户存储库())将JdbcAcCountRepository对象实例化为一个bean,该对象具有id=AcCountRepository,遵循Spring默

  • 问题内容: AsicII表:http://www.asciitable.com 下面的代码打印出相应字符的Dec值,例如“ 123”-> 49 50 51 但是我注意到java是一种强类型语言,这意味着必须在编译时进行所有转换,但是代码如何知道如何以及何时将char转换为AsicII表中正确的Dec值呢?我弄乱了任何Java /编程基础知识吗? 问题答案: A 只是一个无符号的16位数字,因此,由

  • 问题内容: 为什么在最终课程中允许受保护的成员? 这不应该是编译时错误吗? 编辑:正如人们指出的那样,您可以使用默认修饰符来获得相同的程序包访问权限。它的行为应该完全相同,因为protected是默认+子类,而final修饰符明确地拒绝了子类,因此我认为答案不只是提供相同的程序包访问。 问题答案: 该改性剂是必要的方法其覆盖从基类的方法,在没有那些构件暴露于所述。 通常,您可以引入很多不必要的规则

  • 问题内容: 我了解为什么编译器不接受以下内容: 让我感到困惑的是,编译器接受以下内容,并且单元测试通过了: 为什么上述方法有效并且可以正常工作?欢迎使用指向JLS相关部分的指针(15.27.2节仅讨论局部变量)。 问题答案: 我们都同意第一个例子不能用,因为局部变量或参数必须是最终的或有效的最终才能在lambda表达式主体中使用。 但是您的第二个示例不涉及局部变量或参数,而是实例字段。Lambda