【问题标题】:What will happen if I declare main in java non-static [duplicate]如果我在java非静态中声明main会发生什么[重复]
【发布时间】:2015-08-30 12:42:50
【问题描述】:

我最近开始学习 Java,遇到的第一个疑问是 main 在 java 中被声明为静态,这样 JVM 就不必初始化类来访问 main。但我的问题是为什么 JVM 避免初始化具有 main 的类?如果我们将 main 声明为非静态会产生什么成本?

【问题讨论】:

  • 澄清Java 区分initializinginstantiating 类可能很重要。该类只被初始化一次,在类加载器加载它之后和调用该类的任何方法之前的某个时间;例如,初始化程序将值分配给静态变量。当一个新实例被创建并且它的实例初始化器(即构造器)运行时,这个类被实例化。

标签: java oop


【解决方案1】:

编译器会将其视为实例方法,即您将无法使用java YourClass 直接执行它。

但我的问题是为什么 JVM 避免初始化具有 main 的类?

因为不需要初始化类,因为它不能成为应用程序的入口点。在运行时,JVM 将检查是否存在public static void main(String[] args) 方法,如果有,则初始化类(即执行所有静态块,初始化静态变量等)。但是,如果该类作为应用程序的入口点被视为无效,则操作将中断。

【讨论】:

  • “但我的问题是,为什么 JVM 避免初始化具有 main 的类?如果我们将 main 声明为非静态会产生什么成本?” ;)
【解决方案2】:

关键字 static 允许调用 ma​​in() 而不必实例化该类的特定实例。 这是必要的,因为在创建任何对象之前,JVM 会调用 main()。

如果没有入口点怎么执行?

【讨论】:

    【解决方案3】:

    Bootstrap 类加载器在类文件中搜索 main 函数,如果 main 函数未声明为 static,它将出现错误,因为将函数声明为 static 允许在不实例化 main 函数所在的类文件的情况下调用它。

    【讨论】:

      【解决方案4】:

      static 关键字的帮助下,可以调用任何变量、方法或语句块,而无需创建声明它的类的任何对象(或瞬间)。这就是为什么 ma​​in() 被声明为静态的,这样就可以在不创建任何对象的情况下调用它。如果它没有声明为静态的,并且如果存在多个类,那么 JVM 将如何知道实例化哪个类来调用 main 方法。

      【讨论】:

        猜你喜欢
        • 2015-03-31
        • 2016-09-24
        • 2014-03-27
        • 2011-07-06
        • 2013-03-05
        • 2018-05-15
        • 1970-01-01
        • 2016-11-22
        • 2010-09-24
        相关资源
        最近更新 更多