java中的字符串初始化混淆

时间:2015-04-20 17:17:57

标签: java arrays string

我试图在main函数中调用main函数,我已经尝试了以下代码并成功编译了代码。

class test
{
  static int i = 0;

  public static void main(String args[])
  {
    String asda[] = {"!2312"};

    if (++i == 1)
      main(asda);
  }
}

但是在以下代码的情况下会发生错误:

class test
{
  static int i = 0;

  public static void main(String args[])
  {
    if (++i == 1)
      main({"!2312"});
  }
}
这让我很困惑。令人困惑的是,字符串数组初始化是像String A[]={"asdf","Asdf");那样完成的,那为什么它在第二种情况下会出错呢? 我使用的是java 8u40。

3 个答案:

答案 0 :(得分:3)

您正在寻找的语法是:

main(new String[]{"!2312"});

在你的第一个例子中,Java足够聪明,知道你正在创建一个String数组,因为它在String []声明部分。但是,由于你在第二个例子中没有那个,所以Java不够聪明,不知道它是一个String数组,还是一个Objects数组。所以你需要通过包含String []部分来专门告诉Java它是一个String数组。

编辑:我还会注意到您可以使用 varargs 而不是数组作为main()方法的参数:

public static void main(String... args){

然后你可以使用String文字而不是数组来调用main()方法,就像这样:

main("!2312");

您的整个程序可能如下所示:

public class Main{
    static int i = 0;
    public static void main(String... args){
        if (++i == 1){
            main("!2312");
        }
    }
}

这稍微超出了你的问题范围,但你知道可能会有用。

答案 1 :(得分:2)

{"!2312"}等文字的问题在于它们没有类型信息。例如,Java无法知道您是指具有一个值的String[]还是具有一个值的Object[]。您需要通过初始化变量来明确指定它:

String asda[]={"!2312"};
if(++i==1)
    main(asda);

或致电new运营商:

if(++i==1)
    main(new String[]{"!2312"});

答案 2 :(得分:0)

在您通过

将asda传递给main时的上一代码中
main(asda);

asda是一个数组,但{“!2312”}不是数组,主方法接受声明中指定的字符串数组

public static void main(String args[]) 

其中args是一个数组。所以你应该将数组传递给main。 创建一个数组,然后将该字符串文字放入其中,然后将其传递给main。