Java 如何调用";的默认实现;toString";?
如果未定义Java 如何调用";的默认实现;toString";?,java,tostring,Java,Tostring,如果未定义toString,则Java将打印带有一些散列的类名。如果定义了toString,如何实现此功能 package tests.java.lang; public class Try_ToString { public static class MyClass { protected int value; public MyClass(int value) { this.value = value;
toString
,则Java将打印带有一些散列的类名。如果定义了toString
,如何实现此功能
package tests.java.lang;
public class Try_ToString {
public static class MyClass {
protected int value;
public MyClass(int value) {
this.value = value;
}
}
public static class MyClass2 extends MyClass {
public MyClass2(int value) {
super(value);
}
@Override
public String toString() {
return String.valueOf(value);
}
}
public static void main(String[] args) {
MyClass a = new MyClass(12);
MyClass b = new MyClass2(12);
System.out.println("a = " + a.toString());
System.out.println("b = " + b.toString());
}
}
默认的
toString
实现只是将对象的类名“@”与其hashCode
以十六进制连接起来
public static String defaultToString(Object o) {
return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode());
}
class对象的toString方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符“@”和对象哈希代码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
您可以这样做,或者将它放在一个(静态?)方法中。来自@immibis的答案是正确的,但是如果您的类重写hashcode方法,它将不起作用。但是你可以用 为给定对象返回与将返回的哈希代码相同的哈希代码 通过默认方法hashCode(),无论给定对象的 类重写hashCode()。空引用的哈希代码为 零
我不能接受没有思考的简单解决方案,但我找不到:(在中没有直接的方法可以做到这一点,但是对于
tostring
和Object
的特定情况,下面的答案将有所帮助。@DmitryBychenko如果超类也实现了tostring,则不会有任何合理的可用解决方案……事实上,我没有看到任何合理的可用解决方案,即使有反射……默认的tostring
不使用系统。identityHashCode
@immibis在“default to string”中,我假设OP是指在类中不重写hashcode时得到的值。@immibis仅供参考,如果对象的类没有重写hashcode,hashcode()
调用与System.identityHashCode
相同的方法来获取哈希值(如果你看本机实现(我看的是OpenJDK))。我假设OP是指如果你不重写toString
——它总是使用hashCode
,即使它不调用System.identityHashCode
。如果它已经在你的类路径上,你可以使用ObjectUtils.identityString()
来自apache commons lang库,而不是自己实现它。
public static String defaultToString(Object o) {
return o.getClass().getName() + "@" +
Integer.toHexString(System.identityHashCode(o));
}