网站如果直接点击拨打电话,标识设计公司网站,承德网站建设有限公司,深圳做百度网站参考链接#xff1a; 在Java中重写toString()
前言#xff1a; 在你兴高采烈的写完一个类#xff0c;创建测试类时#xff0c;创建对象#xff0c;传入参数#xff0c;调用对象#xff0c;以为会得到参数值#xff0c;但突然发现输出的是“ 类名什么东东#xff1f; 在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类。可在类中按住ctrlt查看继承关系
例如 创建一个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.People279f2327 com.xiaohei.text.People279f2327
但是你想输出的并非是这样的结果而是想输出对象的具体描述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方法 执行结果[I1f32e575 注[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方法方便后面程序员的调用