首先创建一系列数组,并给基本类型数组赋值
// 自定义类数组
T[] t = new T[2];
// 基本类型数组
int[] i = new int[]{1, 2};
short[] s = new short[]{1, 3};
long[] l = new long[]{1, 4};
byte[] b = new byte[]{0, 1};
float[] f = new float[]{2.4f, 2, 3f};
double[] d = new double[]{1.4, 2.6};
char[] c = new char[]{'a', 'b'};
boolean[] bl = new boolean[]{true, false};
将这些数组输出
System.out.println("T " + t);
System.out.println(t);
System.out.println("\nint[] " + i);
System.out.println(i);
System.out.println("\nshort[] " + s);
System.out.println(s);
System.out.println("\nlong[] " + l);
System.out.println(l );
System.out.println("\nbytes[] " + b);
System.out.println(b );
System.out.println("\nfloat[] " + f);
System.out.println(f);
System.out.println("\ndouble[] " + d);
System.out.println(d);
System.out.println("\nchar[] " + c);
System.out.println(c);
System.out.println("\nboolean[]" + bl);
System.out.println(bl);
输出结果为:
T [Lcom.example.test.printTest.T;@3cda1055
[Lcom.example.test.printTest.T;@3cda1055
int[] [I@3fb6a447
[I@3fb6a447
short[] [S@6b2fad11
[S@6b2fad11
long[] [J@73f792cf
[J@73f792cf
byte[] [B@2ed94a8b
[B@2ed94a8b
float[] [F@dfd3711
[F@dfd3711
double[] [D@26ba2a48
[D@26ba2a48
char[] [C@3b81a1bc
ab
boolean[][Z@13fee20c
[Z@13fee20c
观察输出结果发现char数组单独输出时的格式和其他数组不同,输出了数组内容。而其他基本类型数组输出时与自定义类的数组输出时的格式一致。
查找Java官方API文档发现:
println() 方法有多个重载,但这些重载方法的方法参数只有 char 数组而没有其他基本类型数组。此时我们又注意到 在Java中数组也是对象 ,所以其他基本类型数组应该调用了 println(Object x) 方法。
println(Object x) 的源码为:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
其中String.valueOf()方法的源码为:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Object中定义的toString()方法源码为:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
发现使用System.out.println()方法直接输出Object对象时,是以对象类名+@+16进制散列码形式输出。
而当class对象是数组对象时,getName()方法返回以下形式的值,其中[的数目表示数组嵌套深度(数组维度)
[I // int[]
[S // short[]
[J // long[]
[B // byte[]
[F // float[]
[D // double[]
[C // char[]
[Z // boolean[]
[Ljava.lang.Object // Object[]
[Lclassname; // class [] or interface []
回头看上面输出char数组的两行代码和输出结果
System.out.println("\nchar[] " + c);
// char[] [C@3b81a1bc
System.out.println(c);
// ab
为什么char数组前有 "\nchar[] " 时,输出的不是char数组内容了呢?
"\nchar"实际上是一个String类变量,c此时是一个char[] 一维数组,这两个变量相加,IDEA也给了我们一个警告
这一行语句实际上是 String Concatenation by + operator(通过+操作符进行字符串连接),实际上对char数组c隐式调用了方法toString(),而char数组本身没有覆盖toString()方法,所以实际上还是调用了超类Object的toString()方法。