Java 输出对象,为什么会调用 toString 方法
输出对象结果时?你是发现了, 直接输出对象为什么,自动调用toString() 方法?
不多说了直接测试!
创建User 对象
class User{ private int id; private String username; public User(int id, String username) { this.id = id; this.username = username; } public User() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + '}'; } }
输出User对象
System.out.println(new User(1,"admin"));
输出结果
User{id=1, username='admin'}
是不是很好奇?明明调用 user 对象 的 toStirng() 方法,输出结果却是重写的 toSting() ,关键点在于 System.out.println(new User(1,"admin"))
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
发现输出对象调用了 String.valueOf() ,在点进去 看看 String.valueOf()的源代码
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
是不是明白了?原来 默认调用 obj.toString() ,我们知道,Java中,所有对象默认继承了 Object,如果没有重写了toString 方法,那么调用的就是Object对象的 toString() 方法。
Object的 toString() 源代码
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
所以如果没有重写 toString() 方法 ,调用 System.out.println() 输出经常是 完整类名@hashCode的十六进制形式 ,竟然到这里,一起去看看
Integer.toHexString(hashCode())
public static String toHexString(int i) { return toUnsignedString0(i, 4); }
关于 这个方法,源代码的解释是 将整数参数的字符串表示形式返回为基数为 16 的无符号整数。
toHexString() 方法实现
private static String toUnsignedString0(int val, int shift) { // assert shift > 0 && shift <=5 : "Illegal shift value"; int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val); int chars = Math.max(((mag + (shift - 1)) / shift), 1); char[] buf = new char[chars]; formatUnsignedInt(val, shift, buf, 0, chars); // Use special constructor which takes over "buf". return new String(buf, true); }
这个方法将 hansCode 以 多少个 shift ,转换为 String类型返回
好了!本期就到这里了,说来了惭愧,开通了博客园账号这么久,第一次写博客。