为什么以下代码生成此输出,为什么不生成错误/异常?

时间:2019-03-05 07:54:35

标签: java

class VarAgs{

    // variable length parameters
    static void vaTest(String ... str){
        System.out.println(str.length + " contains : ");
        for(String s:str){  
            System.out.print(s+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        String s1[] = {"hi","hello"};
        vaTest(s1);
        vaTest(s1 + " 1 ");
    }
}

输出:

2 contains : 
hi hello 
1 contains : 
[Ljava.lang.String;@2a139a55 1 

3 个答案:

答案 0 :(得分:0)

当您在其中用字符串连接数组时

    vaTest(s1 + " 1 ");

然后将对数组的引用转换为字符串

 [Ljava.lang.String;@2a139a55

因此vaTest方法将收到

[Ljava.lang.String;@2a139a55 1

作为大小为1的数组。

答案 1 :(得分:0)

当您执行vaTest(s1 + " 1 ");时,由于string concatenation规则(“ +”号),将使用s1的字符串表示形式。因此,您得到的不是格式化数组,而是:[Ljava.lang.String;@2a139a55

vaTest(Arrays.toString(s1) + " 1 ");替换它以获得预期的结果。

答案 2 :(得分:0)

它的工作原理如下:

  1. s1被隐式转换为String(s1.toString()),结果为[Ljava.lang.String;@2a139a55
  2. 接下来,将字符串1添加到上述字符串中。结果为[Ljava.lang.String;@2a139a55 1
  3. 接下来,此结果字符串将在String []类型的单元素数组内传递到varargs()函数中。