那么,Java main方法究竟是如何工作的呢?

时间:2014-05-13 02:19:38

标签: java command-line command-line-arguments

public static void main(String [] args)

自从我开始编程以来,这件事一直是个谜。我理解它将一个字符串数组传递给命令行,但它究竟是在哪里做的,它是如何解释的?

我很确定我在这里错了,但我目前的理解是,无论你在main方法中写什么,都会被翻译成机器并作为字符串传递到计算机中。嗯,这一切都很好,但是如果一切都是字符串,它如何理解数值?

此外,在方法方面,它有点奇怪。通常,在设计方法时,您可以编写要传递给它的形式参数,以及要对这些参数执行的操作。但是使用main方法,当您在main方法中编写代码时,您将定义参数!这怎么可以工作?

3 个答案:

答案 0 :(得分:4)

Java中的public static void main(String[] args)方法是在用户开始运行程序时调用的方法。在这个方法中,由你来编写使程序工作所需的任何代码(类和方法)。

是的,此方法的参数是字符串,但这是因为当从命令行执行程序时,这些args是用户在要执行的类的名称之后键入的参数。如果您需要,则由您的代码将其解析为数字。

答案 1 :(得分:4)

  

我很确定我在这里错了,但我现在的理解是这样的   无论你在main方法中写什么,都会被翻译成机器   并作为字符串传递到计算机。嗯,这一切都很好   花花公子,但如果一切都是如此,它如何理解数值   一个字符串?

这句话没有特别意义。是的,可以包含main方法的类被编译为字节代码,可以由JVM读取/解释并在机器上执行。

当执行JVM时(通过运行java命令),它会在指定的类中查找main方法(或者如果您正在执行jar文件,则由{{指定的类) 1}}清单条目)。如果找到,它会将命令行参数作为Main-Class数组传递给您的String方法。

  

此外,在方法方面有点奇怪。通常,何时   设计一个方法,你会写出你正式的参数   传递给它,以及你想用这些参数做什么。但随着   主要方法是在编写时定义参数   main方法里面的代码!这怎么可以工作?

因为JVM不可能知道可以从命令行向它发送什么参数,所以它将所有参数包含在main数组中,这意味着,你可能有很多很多不同的参数发送到您的String方法。

您可以根据程序的需要解释这些参数,并确定它们是否足以让您继续执行。

看看:

了解更多详情。

从历史上看,main方法来自C / C ++,因为它们也有main函数的概念,它以类似的方式运作

答案 2 :(得分:0)

我不熟悉JVM的内部,但假设它在典型的Linux / Unix系统上运行,这里有一些可能性:

1)JVM本身是被调用的实际程序,它将.class名称作为输入(包含main方法)以及其他args(如果需要) - 例如:

java SomeProgram input1 input2 .....

其中SomeProgram.class是从SomeProgram.java编译的,它是具有通常的main()方法的类。

2)现在,典型的Linux / Unix环境中的JVM是一个' ELF二进制文件' (可执行和链接格式),其中包含' main'方法定义。这里描述了所有的血腥细节,包括输入如何从shell传递到正在运行的可执行文件(在Intel平台上):

http://linuxgazette.net/84/hawk.html

3)简而言之,JVM按照(2)中的描述获取输入,然后通过将所有输入复制到String []数组来有效地运行Someclass.main()方法。

4)所有输入都被视为String,因此如果您需要将某些输入视为数字,则需要根据需要显式转换它们。

虽然ELF标准是Linux / Unix系统的一部分,但我假设其他支持Java的平台正在发生类似的事情。

我希望如果我错了,对JVM内部有更多了解的人可以纠正我。