为什么Java主要方法是静态的?

时间:2020-03-06 14:51:04  来源:igfitidea点击:

Java main()方法的方法签名为:

public static void main(String[] args){
    ...
}

此方法是否有理由是静态的?

解决方案

这只是一个约定,但可能比其他方法更方便。使用静态主程序,调用Java程序所需要做的就是知道类的名称和位置。如果不是静态的,则还必须知道如何实例化该类,或者要求该类具有空的构造函数。

C ++和Cand Java中的main()方法是静态的,因为运行时引擎随后可以调用它们,而无需实例化父类的实例。

在调用main方法之前,不会实例化任何对象。使用static关键字意味着可以在不首先创建任何对象的情况下调用该方法。

因为否则,它将需要执行对象的实例。但是必须从头开始调用它,而不必首先构造对象,因为通常这是main()函数(引导程序)的任务,通常是通过使用这些参数/程序参数来解析参数并构造对象。

如果不是,那么如果有多个构造函数,则应使用哪个构造函数?

Java语言规范中提供了有关Java程序的初始化和执行的更多信息。

构造了各种Applet,Midlet,Servlet和Bean,然后在其上调用了生命周期方法。调用main是对main类所做的全部工作,因此不需要将状态保留在多次调用的对象中。将main固定在另一个类上是很正常的(尽管不是一个好主意),这会妨碍使用该类来创建主要对象。

这只是一个约定。如果这是约定,那么JVM当然可以处理非静态主方法。毕竟,我们可以在类上定义一个静态初始化器,并在进入main()方法之前实例化大量的对象。

该方法是静态的,因为否则会产生歧义:应调用哪个构造函数?特别是如果班级看起来像这样:

public class JavaClass{
  protected JavaClass(int x){}
  public void main(String[] args){
  }
}

JVM应该调用new JavaClass(int)吗? x应该通过什么?

如果不是,那么JVM是否应该在不运行任何构造函数方法的情况下实例化JavaClass?我认为不应该这样做,因为这会使整个类处于特殊情况,有时我们有一个尚未初始化的实例,并且必须在每个可以调用的方法中进行检查。

对于JVM,在调用入口点之前必须实例化一个类,存在太多的极端情况和含糊不清的地方。这就是为什么" main"是静态的。

我不知道为什么main总是被标记为public

如果main方法不是静态的,则需要从程序外部创建main类的对象。我们想怎么做?

这只是约定。实际上,即使名称main()以及传入的参数也完全是约定俗成的。

当我们运行java.exe(或者Windows上的javaw.exe)时,实际上发生了几次Java本机接口(JNI)调用。这些调用将加载真正是JVM的DLL(正确的是java.exe不是JVM)。 JNI是我们在桥接虚拟机世界以及C,C ++等世界时所使用的工具。反之亦然,至少(据我所知)不可能真正获得JVM。在不使用JNI的情况下运行。

基本上,java.exe是一个超级简单的C应用程序,它解析命令行,在JVM中创建一个新的String数组来保存这些参数,解析出我们指定为包含main()的类名,使用JNI调用来查找main()方法本身,然后调用main()方法,将新创建的字符串数组作为参数传入。这非常类似于使用Java反射时所执行的操作,它只是使用容易混淆的命名本机函数调用。

编写自己的版本的java.exe(源代码随JDK分发)并让它执行完全不同的操作,这是完全合法的。实际上,这正是我们对所有基于Java的应用程序所做的事情。

我们每个Java应用程序都有自己的启动器。我们主要这样做是为了获得自己的图标和进程名称,但是在其他情况下,除了要进行常规main()调用以使事情继续进行之外,它在其他情况下也很方便(例如,在一种情况下,我们正在执行COM互操作性,我们实际上将COM句柄传递给main()而不是字符串数组)。

所以,长话短说:它是静态的原因是方便的b / c。之所以称其为" main",是因为它必须是某种东西,而main()就是他们在C的早期(当时的函数名称很重要)所做的事情。我想java.exe可以允许我们仅指定一个完全限定的主方法名称,而不是仅指定类(java com.mycompany.Foo.someSpecialMain),但是这使IDE很难自动检测"可启动"。 '在一个项目中上课。

因为,静态成员不是任何特定类的一部分,并且该main方法不要求创建其Object,但仍可以引用所有其他类。

static表示此方法是类方法。无需任何类对象就可以调用该方法。

由于从main()和Java执行程序的开始是纯粹面向对象的程序,其中在main()中声明了对象,这意味着在创建对象之前会先调用main(),因此如果main()会是非静态的,则可以调用它因为静态意味着不需要对象,所以将需要一个对象。

静态方法不需要任何对象。它直接运行,所以main直接运行。