如何调用"toString"的默认实现?

Suz*_*ioc 10 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;
        }
    }

    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());

    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_* C. 13

来自@immibis的答案是正确的,但如果您的类覆盖哈希码方法,它将无效.但你可以使用System.identityHashcode.

返回给定对象的相同哈希码,就像默认方法hashCode()返回的一样,无论给定对象的类是否覆盖hashCode().空引用的哈希码为零.

public static String defaultToString(Object o) {
     return o.getClass().getName() + "@" + 
            Integer.toHexString(System.identityHashCode(o));
}
Run Code Online (Sandbox Code Playgroud)

  • 默认的“toString”不使用“System.identityHashCode”。 (2认同)
  • @immibis通过"default toString",我假设OP表示如果你不在你的类中重写hashcode就得到的那个. (2认同)
  • @immibis仅供参考,如果对象的类没有覆盖哈希码,`hashcode()`调用与`System.identityHashcode`相同的方法来获取哈希值(如果查看本机实现(我查找OpenJDK)). (2认同)
  • 如果它已经在您的类路径中,您可以使用 apache commons-lang 库中的“ObjectUtils.identityToString()”,而不是自己实现它。 (2认同)

use*_*751 9

默认toString实现只是连接对象的类名"@"和hashCode十六进制的类.

public static String defaultToString(Object o) {
    return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode());
}
Run Code Online (Sandbox Code Playgroud)