关于Arrays的toString()和Object的toString()的区别

[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是独立存在的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值