什么是“ String args []”?主方法Java中的参数


315

我刚刚开始用Java编写程序。以下Java代码是什么意思?

public static void main(String[] args)
  • 什么String[] args

  • 您什么时候使用这些args

源代码和/或示例优先于抽象解释

Answers:


302

在Java中,args包含提供的命令行参数作为String对象数组。

换句话说,如果你运行你的程序作为java MyProgram one two然后args将包含["one", "two"]

如果要输出的内容args,可以像这样遍历它们...

public class ArgumentExample {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}

51
值得注意的是,args不一定要命名args(您可以根据需要命名),尽管最好遵循约定。您可能还会String... args不时看到,这是等效的。
vikingsteve

68
args索引从0开始。(与C相反,它为您提供了程序的名称)
AdrieanKhisbe 2014年

1
@Daniel,是否args确保与操作系统无关的空格隔开?
Pacerier 2014年

@Pacerier对不起,我来晚了很多,我没有消息来源,但我坚信他们是。在我看来,好像java(.exe)正在处理参数,而不是底层的shell /终端。就拿-version例如,它是java -versionjava.exe -version,但不java.exe /version(尝试加载主类.version)。如果有人偶然发现,我的只需2美分。
路加福音

1
@Luke不可能如此,至少在Unix系统上不是这样。外壳程序将参数传递给已根据外壳程序规则拆分的程序(相应地删除了引号/转义)。程序(在这种情况下为Java解释器)无法访问原始的未拆分命令行,也不希望这样做,因为这会使用户感到困惑。
regnarg

112

这些用于Java中的命令行参数。

换句话说,如果您跑步

java MyProgram一二

然后args包含:

[ “一二” ]

public static void main(String [] args) {
    String one = args[0]; //=="one"
    String two = args[1]; //=="two"
}

这样做的原因是将应用程序配置为以特定方式运行或向其提供所需的一些信息。


如果您不熟悉Java,强烈建议您阅读Oracle的官方Java TM Tutorials


45

args包含调用时传递给Java程序的命令行参数。例如,如果我这样调用程序:

$ java MyProg -f file.txt

然后args将是一个包含字符串"-f"和的数组"file.txt"


感谢您的回答。
Chaklader Asfak Arefe

我必须先编译代码,javac MyProg.java然后才能运行java MyProg -f file.txt。是否有原因,因为答案中没有提到?
stanimirsp

19

以下答案是基于我的理解和一些测试。

什么是String [] args?

Ans->

String [] ->我们知道这是一个简单的String数组。

args- >是数组的名称,它可以是任何值(例如,ar,ar,参数,param,参数),编译器和已执行的问题都没有,我也测试过。

例如
1)public static void main(String [] arguments)

2)public static void main(String []参数)

什么时候使用这些参数?

Ans->

主要功能由开发人员非常智能地设计。实际思维很深刻。它基本上是在考虑基于命令行参数的C&C ++的基础上开发的,但如今没有人使用它了。

1-用户可以从命令行输入任何类型的数据,可以是Number或String以及编译器接受它所必需的,我们应该使用哪种数据类型?看东西2

Thing 2- String是数据类型,它支持Java中的所有原始数据类型,例如int,long,float,double,byte,shot,char。您可以轻松地以任何原始数据类型来解析它。

例如,以下程序已编译并执行,并且我也进行了测试。

如果输入为-> 1 1

// one class needs to have a main() method
public class HelloWorld
{
  // arguments are passed using the text field below this editor
  public static void main(String[] parameter)
  {    
System.out.println(parameter[0] + parameter[1]); // Output is 11

//Comment out below code in case of String
    System.out.println(Integer.parseInt(parameter[0]) + Integer.parseInt(parameter[1])); //Output is 2
    System.out.println(Float.parseFloat(parameter[0]) + Float.parseFloat(parameter[1])); //Output is 2.0    
    System.out.println(Long.parseLong(parameter[0]) + Long.parseLong(parameter[1])); //Output is 2    
    System.out.println(Double.parseDouble(parameter[0]) + Double.parseDouble(parameter[1])); //Output is 2.0    

  }
}

13

甚至OP都只是在谈论 String[] args,我也想给出一个完整的例子public static void main(String[] args)

Public : 是一个 访问修饰符,它定义谁可以访问此方法。Public表示该方法将可由任何类访问(如果其他类能够访问此类。)。

Static:是标识类相关事物的关键字。这意味着给定的Method或变量与实例无关,而与Class相关。无需创建Class实例即可访问它。

Void:用于定义方法的返回类型。它定义了方法可以返回的内容。无效表示方法将不返回任何值。

main:是方法的名称。JVM搜索此方法名称,作为仅具有特定签名的应用程序的起点。

String[] args :是主要方法的参数。

如果查看JDK源代码(jdk-src \ j2se \ src \ share \ bin \ java.c):

/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                   "([Ljava/lang/String;)V");
...
{    /* Make sure the main method is public */
...
mods = (*env)->CallIntMethod(env, obj, mid);
if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
    message = "Main method not public.";
    messageDest = JNI_TRUE;
    goto leave;
...

您可以看到必须命名java 中的启动方法main并且必须具有特定的签名public static void main(String[] args)

该代码还告诉我们,该代码public static void main(String[] args)不是固定的,如果将(jdk-src \ j2se \ src \ share \ bin \ java.c)中的代码更改为另一个签名,它将起作用,但是更改此代码还会给您带来其他可能的问题由于Java 规范

Offtopic: OP提出这个问题已有7年了,我猜想OP可以回答他自己的问题了。


12

String [] args 这也是您在Java中声明字符串数组的方式。

在此方法签名中,args调用该方法时,数组将被值填充(如此处的其他示例所示)。由于您正在学习,因此值得理解的是,此args数组就像您在方法中自己创建一个数组一样,如下所示:

public void foo() {
    String [] args = new String[2];
    args[0] = "hello";
    args[1] = "every";

    System.out.println("Output: " + args[0] + args[1]);

    // etc... the usage of 'args' here and in the main method is identical
}

12

我会分手的

public static void main(String args[])

部分地。

“ public”表示可以从任何地方调用main()。

“静态”表示main()不属于特定对象

“无效”表示main()不返回任何值

“ main”是函数的名称。main()之所以特别是因为它是程序的开始。

“ String []”表示String的数组。

“ args”是String []的名称(在main()体内)。“ args”并不特殊;您可以将其命名为其他名称,并且程序可以正常运行。

  • String[] args是字符串的集合,用空格分隔,可以在终端上的程序中键入该字符串。初学者不会多次使用此变量,但它总是存在,以防万一。

9

完成代码后,将其转换为扩展名为.java的文件,可以通过双击该文件来运行它,也可以在整个控制台(Mac上为终端,Windows上为cmd.exe)中运行该文件。许多事情,许多东西。一件事是他们可以看到控制台消息(System.out.print或System.out.println),如果双击它们就看不到。他们可以做的另一件事是指定参数,因此通常您会使用该行

java -jar MyCode.jar

在导航到该程序的文件夹后

cd C:My/Code/Location

在Windows上或

cd My/Code/Location

在Mac上运行(注意mac不太笨拙)以运行代码,但要指定要使用的参数

java -jar MyCode.jar parameter1 parameter2

这些参数存储在args数组中,您可以在程序中使用该参数,以便允许用户控制特殊参数,例如要使用的文件或程序可以拥有的内存量。如果您想知道如何使用数组,则可以在此站点上找到一个主题,或者只是在Google上搜索它。注意,可以使用任意数量的参数。


9

用简单的外行语言解释。

当我们将JVM指向类名时,main方法期望我们提供一些参数。这意味着,假设您的文件名为Try.java,现在要在命令提示符下执行此操作,请先编写“ javac Try.java”进行编译,然后再编写“ java Try”进行执行。现在,假设您编写的不是“ java Try”,而是编写“ java Try 1”。在这里,您传递了一个参数“ 1”。即使您的代码中未使用它,也将由您的main方法采用。

如果要检查您的main方法是否实际采用了参数“ 1”。只需在您的主要方法中键入以下内容:

for(int i = 0; i < args.length; i++) {
        System.out.println("Argument is: "+args[i]);
    }

7

我认为上面的答案已经很好地覆盖了它,String args[]只是一个字符串参数数组,您可以在运行它时将其传递给应用程序。为了完成,我可能会补充说,将传递给main方法的方法参数定义为String类型的变量参数(varargs)也有效:

public static void main (String... args)

换句话说,该main方法必须接受String数组(String args[])或varargs(String... args)作为方法参数。这个名字args也没有魔法。您最好写arguments,甚至freddiefujiwara如下所示:

public static void main (String[] arguments)

public static void main (String[] freddiefujiwara)


6

从控制台执行Java类时,主要方法是所谓的方法。为了做到这一点,这个main方法的定义必须是

public static void main(String [])

此字符串数组称为args的事实是一种标准约定,但并非严格要求。您将在调用程序时在命令行中填充此数组

java MyClass a b c

这些通常用于定义程序的选项,例如要写入或读取的文件。


6

in public static void main(String args []) args是控制台行参数的数组,其数据类型为String。在此数组中,您可以通过在命令行中调用它们来存储各种字符串参数,如下所示: java myProgram Shaan Royal 然后Shaan和Royal将以arg [0] =“ Shaan”的形式存储在数组中;arg [1] =“皇家”; 您可以在不通过命令行调用它们的情况下,也可以在程序内部手动执行此操作。


3

样式dataType[] arrayRefVar是首选。该样式dataType arrayRefVar[]来自C / C ++语言,在Java中已采用,以适应C / C ++程序员。


1

String[] args参数是一个字符串数组作为参数传递,当你正在运行通过在操作系统的命令行应用程序。

因此,假设您已经编译并打包了myApp.jarJava应用程序。当然,您可以通过在操作系统中双击运行该应用程序,但是也可以使用命令行方式运行它,例如(例如在Linux中):

user@computer:~$ java -jar myApp.jar

当您调用应用程序时,传递一些参数,例如:

user@computer:~$ java -jar myApp.jar update notify

java -jar命令将把您的字符串update和方法传递notify给您public static void main()

然后,您可以执行以下操作:

System.out.println(args[0]); //Which will print 'update'
System.out.println(args[1]); //Which will print 'notify'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.