任何人都可以解释我在编译这个程序时得到的输出吗?

时间:2013-11-30 09:29:41

标签: java

当我得到一个奇怪的输出时,我执行了下面提到的代码。任何人都可以解释为什么我得到这个输出?

代码:

public class Bar {

    static void foo( int... x ) {
        System.out.println(x);
    }
    static void foo2( float... x ) {
        System.out.println(x);
    }
    public static void main(String args[])
    {
            Bar.foo(3,3,3,0);
            Bar.foo2(3,3,3,1);
            Bar.foo(0);
    }
}

输出

[I@7a67f797
[F@3fb01949
[I@424c2849

为什么我们要获取"[I@" / "[F@"前缀和8个字母数字字符,它们是内存地址吗?

4 个答案:

答案 0 :(得分:7)

Java数组有toString()方法,它只显示数组的类型([I),后跟@,后跟数组的哈希码({{1} }})。这个值几乎毫无意义。 7a67f797是调用传递给toString()的每个对象的方法。

如果要查看数组的内容,请使用System.out.println()

答案 1 :(得分:3)

float...float[]的语法糖,所以

System.out.println(x);

...正在尝试输出一个数组。所以你得到default toString behavior of objects,而不是数组中的值。

要输出数组,要么循环遍历它,要么使用类似Arrays.toString的内容:

System.out.println(Arrays.toString(x));

  

...以及要遵循的8个字母数字字符,它们是内存地址吗?

不,它们只是对象的哈希码(the first link above中有这个内容)。

答案 2 :(得分:1)

使用它来查看数组中的值。

System.out.println(x[0]);
System.out.println(x[1]);
....
System.out.println(x[3]);

答案 3 :(得分:1)

1)foo(int ... x)被称为varargs(变量参数)。编译器用实际的Bar.foo替换Bar.foo(3,3,3,0)(new int [] {3,3,3,0})

2)您正在打印float和int数组。它们从Object继承toString:

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
   }

[I[F是int []和float []的类名,试试这个

System.out.println(float[].class.getName());

输出

[F