[Arrays的toString()和Object的toString()的不同]
不想看过程可直接看结论,结论在最底部
First,我们先要搞清楚Object中的toString的用法.
toString()的源代码为:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
我们可以了解到,如果我们没有重写toString方法,那么它的返回值会是:全类名+@+哈希值的16进制
举例代码如下:
//JVM的入口:
Object obj = new Object();
System.out.println(obj.toString());
//输出的结果为:java.lang.Object@15db9742
Second,我们在实际运用中大部分是想返回对象的属性,所以我们就得在子类中重写这个方法.举例如下:
(*)
class Dog{
String name;
int age;
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
//这样对象调用toString方法的时候,就会输出对象属性.
//此类记为*,后面讲Arrays会用到用到
Third,我们看Arrays的API
我们发现Arrays里也有toString方法.
Q:感觉它和代码(*)一样,也是重写了toString方法吗?毕竟Object类是所有类的父类嘛!
A:完全错误!我们注意到Arrays的toString方法都是静态的,子类的静态方法如果和父类重名,那么即隐藏,当类(不是对象)直接调用toString的时候,直接访问静态方法,此方法不是对Object中toString的重写.
总而言之,就是Arrays中的toString方法和Object中的toString方法没有直接联系.这2个只是重名而已.Arrays类调用就用Arrays的,Object对象调用就用Object的!
我们直接举例:,例1:
public class Test1 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
System.out.println(arr.toString());
//↑输出结果为[I@15db9742
System.out.println(Arrays.toString(arr));
//↑输出结果为:[1, 2, 3, 4, 5]
上面的例子我们可以得出:Arrays.toSting()这个静态方法功能是将数组里的内容都打印出来.这个和Second中我们重写toString方法的意愿一样,就是不打印地址,而是打印对象的属性.
但是我们得注意的是这里Arrays不是重写,而是独立的toString方法.
例2(Test类+dog类):
public class Test2{
Dog[]dogs = new Dog[3];//存储3个狗对象
dogs[0] = new Dog("啸天",1);
dogs[1] = new Dog("二哈",2);
dogs[2] = new Dog("大黄", 1);
System.out.println(Arrays.toString(dogs));
//输出结果为:
//[demo1.Dog@6d06d69c, demo1.Dog@7852e922, demo1.Dog@4e25154f]
}
class Dog{
String name;
int age;
public Dog(String name,int age){
this.name = name;
this.age = age;
}
}
我们得知输出的内容不是我们所希望的属性值,为什么呢?我们来看传入Object[]的源代码.
public static String toString(Object[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(String.valueOf(a[i]));//#
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
#行的String.valueOf()的源代码如下:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
我们仔细读阅可知,当我们利用Arrays.toString() 的时候,我们如果传的参数是存着对象的数组,那么,他每个对象返回的是Object类的toString方法,即类名加地址值,我们并没有将Dog类重写,所以返回的还不是属性,改进代码如下:
例3(Test2类+())*
public class Test2{
Dog[]dogs = new Dog[3];//存储3个狗对象
dogs[0] = new Dog("啸天",1);
dogs[1] = new Dog("二哈",2);
dogs[2] = new Dog("大黄", 1);
System.out.println(Arrays.toString(dogs));
//输出结果为:
[Dog [name=啸天, age=1], Dog [name=二哈, age=2], Dog [name=大黄, age=1]]
class Dog{
String name;
int age;
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
Dog重写了toString方法,所以最后打印的都是属性值,
结论
Arrays这个类中,也有toString方法,直接显示数组中的数据。方便观看数组中的内容
-
基本数据类型:直接显示数值本身
-
引用数据类型:显示的是对象,自动调用该对象的toString()
如果这个类没有重写toString(),那么就依次显示类名+地址
如果重写了toString(),那么就依次显示重写的内容
重点:Arrays类的toString不是对Object类中toString的重写,他们只是重名,Arrays的toString是独立存在的