java重写toString()方法

前言:
在你兴高采烈的写完一个类,创建测试类时,创建对象,传入参数,调用对象,以为会得到参数值,但突然发现输出的是“ 类名@什么东东?(其实是散列码,也是16进制的哈希值哈)”,反复检查代码,但不知怎么修改。我不知道你们有没有这种情况发生,但是我经常就有,原因当然是因为不习惯重写toString方法和基础知识还不足导致的啦。还是要加油呀!所以记录一下学习的toString()方法。

1.1 在Object类中有一个重要的方法:toString()方法。

作用:用于返回表示对象值的字符串

1.2 为啥要重写toString方法呢?

Object类中的toString方法返回的是什么呢?我们打开toString源码发现:

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

返回的字符串是:类名@散列码。
那为什么其它类的对象返回的也是这样的形式呢?因为所有的类的超类都是Object类。(可在类中按住ctrl+t查看继承关系)

例如:
创建一个People类:

public class People {
	private String name;
	private int age;
	public People(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

测试类:

/**
 * toString方法的调用
 * @懒惰的小黑
 *
 */
public class toStringTest {
	public static void main(String[] args) {
		People p = new People("懒惰的小黑",20);
		System.out.println(p);  			//p会自动调用toString方法
		System.out.println(p.toString());	//手动调用
	}
}

执行结果:
com.xiaohei.text.People@279f2327
com.xiaohei.text.People@279f2327

但是你想输出的并非是这样的结果,而是想输出对象的具体描述(name和age),所以需要在类中重写toString方法。
重写toString方法:

	public String toString() {
		return "[name = " + getName() + ",age = "+ getAge() + "]";
	}

测试:

		People p = new People("懒惰的小黑",20);
		System.out.println(p);  			//p会自动调用toString方法

执行结果:
[name = 懒惰的小黑,age = 20]

实际上,还可以设计的更好一些。最好通过getClass().getName() + 类的描述:获取类名的字符串(地址)+类的描述。
例:

	public String toString() {
		return getClass().getName() + "[name = " + getName() + ",age = "+ getAge() + "]";
	}

测试: 同上例
执行结果: com.xiaohei.text.People[name = 懒惰的小黑,age = 20]

注意: 此处的getClass().getName()中的getName并非People类中的getName方法!

1.3 toString方法也可供子类使用,子类只需调用super.toString()。

例如
创建子类:

class Teachers extends People{
	private int salary;
	public Teachers(String name, int age,int salary) {
		super(name, age);
		this.salary = salary;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	public String toString() {
		return super.toString() + ",salary = " + getSalary();
	}
}

测试:

public class toStringTest {
	public static void main(String[] args) {
		Teachers t = new Teachers("懒惰的小黑",20,5000);
		System.out.println(t);

	}
}

执行结果: [name = 懒惰的小黑,age = 20],salary = 5000

1.4 数组类型调用toString()方法

数组继承了Object类中的toString方法,数组类型会按旧格式打印。

例如:

public class ArraytoStringTest {
	public static void main(String[] args) {
		int[] a = {5,6,2,1,3};
		System.out.println(a);			//自动调用toString方法

执行结果:[I@1f32e575
注:[I 表明是一个整形数组。

所以我们需要调用Array.toString 方法
例如:

import java.util.Arrays;

public class ArraytoStringTest {
	public static void main(String[] args) {
		int[] a = {5,6,2,1,3};
		String a1 = Arrays.toString(a);
		System.out.println(a1);
	}
}

执行结果:[5, 6, 2, 1, 3]

说明:为什么会出现这种形式呢?按住ctrl点击toString方法,查看源码:

    public static String toString(int[] 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(a[i]);
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }

注意:打印多维数组则需调用Arrays.deepToString()方法

总结提醒:建议类中都要重写toString方法,方便后面程序员的调用!

  • 33
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值