5

main 方法是 Java 应用程序中关于启动应用程序作为入口点的最重要的方法。在使用此方法之前发生的情况尚不清楚。请有人可以通过根据方法签名纠正我的看法来帮助我理解/澄清在使用该方法之前会发生什么,如下所示:

  • JVM 至少会创建一个 Object 来访问您的 main 方法。这个(假定的)对象尝试根据显然将您绑定到已知方法签名的 API 访问您的 Java 应用程序public static void main (String[] args){}

    • public 您不能限制 JVM 上的(假定的)单独对象访问包含 main 方法的对象,完全只看逻辑而不是 API/签名?

    • static根本没有对象启动并运行来创建任何其他对象实例(除了假定的 JVM 实例)来实例化或创建对象。static 修饰符意味着访问此方法的唯一可能性,因为它没有绑定到实例,因此可以在没有实例的情况下访问。再一次,这是逻辑,因为没有任何对象启动并运行(除了假定的 JVM 对象),还没有任何对象可以实例化任何其他对象?

    • args跨语言和应用程序/可执行文件的标准,以提供自定义应用程序的能力?|

这是接近和理解主要方法的正确且合乎逻辑的方式吗?

4

4 回答 4

9

尚不完全清楚您真正要问的是什么,但JVM 规范第 5.2 节至少涵盖了其中的一些内容:

Java 虚拟机通过使用引导类加载器(第 5.3.1 节)创建一个初始类来启动,该类以依赖于实现的方式指定。Java 虚拟机然后链接初始类,对其进行初始化,并调用公共类方法 void main(String[])。调用此方法会驱动所有进一步的执行。执行构成主要方法的 Java 虚拟机指令可能会导致附加类和接口的链接(并因此创建),以及调用附加方法。

在 Java 虚拟机的实现中,初始类可以作为命令行参数提供。或者,实现可以提供一个初始类,该类设置一个类加载器,然后加载一个应用程序。初始类的其他选择是可能的,只要它们与前一段中给出的规范一致。

JLS 12.1 节也有一些其他的描述。

JVMmain直接调用该方法——它不需要创建新对象来执行此操作。尽管main方法本身必须是公共的,但它声明的类却不是。例如:

public class Test {
    private static class EntryPoint {        
        public static void main(String[] args) {
            System.out.println("Hi");
        }
    }
}

然后执行:

java 'Test$EntryPoint'

它按预期打印“Hi”。

除了通过特权反射或 JVM 显然有能力的直接访问之外,Test类之外的任何代码都无法访问。EntryPoint.main()

于 2013-04-10T10:08:46.280 回答
2

java首先启动它的核心——java.lang、类加载器、系统属性、运行时等,然后看看它必须做什么。在初始化 JVM 之前,该进程中没有“java”。它只是一个本地进程,所以我认为在这发生之前用 Java 术语思考是错误的。

现在 JVM 启动器将首先查看 pre mains,按顺序调用它们(首先调用相应的静态块)然后查看 main 方法,如果有类,则调用静态块;最后调用 main 方法,将任何命令行参数传递给 premain 和 main 方法。

简单测试:

public class Test {

    static{
            System.out.println("Hi static 1");        
    }

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

    static{
        System.out.println("Hi static 2 better to have 1 static block per class but you can have N ");        
    }

}

于 2013-04-10T10:51:42.927 回答
0

当您输入 java someClassName 之类的命令时,就会发生流动的事情。1.它加载类 someClassName 并执行静态块(如果有) 在类加载期间,将创建一个对象类类,它将代表您的类。2.它使用类名调用主方法(它不会创建你的类的任何对象),这就是为什么主方法是静态的。

于 2013-04-10T10:14:17.053 回答
0

说,文件Demo.java包含源代码

public class Demo{ 

}

当此代码被编译为成功编译为

$javac Demo.java

但是当它被执行为

$java Demo

然后它显示一个异常错误

Demo类中找不到main方法,请将main方法定义为:public static void main(String[] args)

所以编译器不负责检查main()方法是否存在。JVM对此负责。JVM检查main()原型为的方法

public static void main(Strings[] args)
  1. 为什么选择JVM搜索main()方法?是否可以将main()方法更改为任何其他方法main_hero()

JVM 被指示main()从 JVM 内部查找方法。是的,可以将main()方法更改为main_hero()方法,但在 JVM 中,您必须指示搜索main_hero()方法。

JVM{ 

    public static void main(String[] args)  
}

JVM{ 

    public static void main_hero(String[] args)     
}
  1. 为什么要公开?

JVM 安装在 C 或 D 驱动器中,因此可以从任何使用公共的地方调用。

  1. 为什么是静态的?

main()方法与对象无关,因此如果没有现有对象,JVM 也必须调用此方法。main方法与对象无关。

  1. 为什么作废?

JVM 将调用main()方法,但是如果main()方法返回,JVM 可以对返回值做什么。所以它的意思是void

于 2016-06-06T09:06:40.430 回答