【问题标题】:How to call default implementation of "toString"?如何调用“toString”的默认实现?
【发布时间】:2014-05-05 08:35:18
【问题描述】:

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

    }
}

【问题讨论】:

  • 我不能接受没有没有反思的简单解决方案,但我找不到它:(
  • general case 中没有直接的方法可以做到这一点,但对于tostringObject 的具体情况,下面的答案会有所帮助。
  • @DmitryBychenko 如果超类也实现了 toString...
  • 事实上,我没有看到任何合理可用的解决方案,即使有反射......

标签: java tostring


【解决方案1】:

默认的toString 实现只是连接对象的类名“@”及其十六进制的hashCode

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

【讨论】:

    【解决方案2】:

    @immibis 的答案是正确的,但是如果你的类覆盖了 hashcode 方法,它就不起作用了。但是你可以使用System.identityHashcode

    为给定对象返回与返回相同的哈希码 通过 default 方法 hashCode(),是否给定对象的 类覆盖 hashCode()。空引用的哈希码是 零。

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

    【讨论】:

    • 默认toString不使用System.identityHashCode
    • @immibis 通过“默认 toString”,我假设 OP 是指如果你不覆盖类中的哈希码,则你得到的那个。
    • @immibis 仅供参考,如果对象的类没有覆盖哈希码,hashcode() 调用与System.identityHashcode 相同的方法来获取哈希值(如果您查看本机实现(我寻找OpenJDK))。
    • 我认为 OP 是指如果你不覆盖 toString 时你得到的那个——它总是使用 hashCode,即使它不调用 System.identityHashCode
    • 如果它已经在你的类路径中,你可以使用 apache commons-lang 库中的 ObjectUtils.identityToString() 而不是自己实现它。
    【解决方案3】:

    The docs tell the how the implementation works.

    Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,这个方法返回一个字符串等于:

    getClass().getName() + '@' + Integer.toHexString(hashCode())
    

    您可以这样做,或者将其放入(静态?)方法中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多