为什么main方法在java中是静态的

Hap*_*tal 13 java static program-entry-point

我听到有人说"如果main不是静态的,那么JVM可以创建一个包含main的类的对象,并通过对象调用main.
但问题是JVM如何知道在重载构造函数的情况下调用哪个构造函数,或者即使有只有一个参数化的构造函数,然后才能通过."

这是正确的理由吗?
因为如何在不进入主函数的情况下创建类的对象?
请就此发表意见.如果这不是正确的理由,那么正确的原因是什么?

ben*_*ado 18

这只是一个惯例.Java语言设计者可以很容易地决定你必须指定一个要实例化的类,使其构造函数成为主要方法.但是调用静态方法同样有效,并且不需要首先实例化类.

此外,如果类具有超类,则可以通过更改超类来更改程序启动的行为(因为必须在子类之前调用​​超类构造函数),这可能是无意的.静态方法没有这个问题.

主要方法是静态的,因为它使事情变得更简单,但如果他们想让它变得更复杂,他们就可以拥有.

  • Java以C为模型,"main"的Java概念非常接近"main"的C概念. (2认同)

Osc*_*Ryz 5

"这个理由是对的吗?"

它在某种程度上,虽然从来没有像那样具体解释过.

我们可以让约定也调用构造函数String...args ,这意味着你至少需要一个对象来运行,但(可能)设计者认为不需要它.

例如,有这样的东西没有技术障碍:

 class Hello {
       public void main(String...args){
           System.out.println("Hello, world");

       }
 }
Run Code Online (Sandbox Code Playgroud)

事实上,如果你没有指定一个,那么Java会为你创建一个无参数的构造函数,如果类包含一个main方法,那么包含一个var args构造函数也很容易,并且在底层创建以下代码:

 class Hello {
      // created by the compiler
      public Hello(){}
      public Hello( String ... args ) {
          this();
          main( args );
      }
      // end of code created by the compiler
      public void main( String ... args ) {
           System.out.println("Hello, world!");
      }
  }
Run Code Online (Sandbox Code Playgroud)

但是这会产生不需要的代码,以及在这种情况下不会做任何事情的额外分配对象; 两个构造函数(而不是一个)等.最后它看起来就像是太多的魔法.

取决于语言设计师.在这种情况下,他们可能认为不这样做会更简单,只是验证调用的类是否具有被调用的方法的特殊签名public static void main( String [] args )

顺便说一句,你可以Hello! world没有main方法的情况下使用Java 编写程序,但它会抛出java.lang.NoSuchMethodError: main

public class WithoutMain {
    static {
        System.out.println("Look ma, no main!!");
        System.exit(0);
    }
}

$ java WithoutMain
Look ma, no main!!
Run Code Online (Sandbox Code Playgroud)

我知道它不是另类,但是,有趣的不是吗?