Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何调用";的默认实现;toString";?_Java_Tostring - Fatal编程技术网

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