如何在Java中强制调用超类实现Object.toString()而不是子类重写对象的实现

如何在Java中强制调用超类实现Object.toString()而不是子类重写对象的实现,java,overriding,superclass,subclassing,Java,Overriding,Superclass,Subclassing,请注意:我不是问如何强制所有类在其源代码中重写toString()。请仔细阅读这个问题 java中的所有类都扩展了对象类。如果任何类都有一个toString()重写,那么对Object.toString()的调用将实际执行重写方法 例如: String test = "StackOverflow"; Object testobj1 = (Object) test; System.out.println(testobj1.toString()); // prints "

请注意:我不是问如何强制所有类在其源代码中重写
toString()
。请仔细阅读这个问题

java中的所有类都扩展了
对象
类。如果任何类都有一个
toString()
重写,那么对
Object.toString()
的调用将实际执行重写方法

例如:

String test = "StackOverflow";
Object testobj1 = (Object) test;
System.out.println(testobj1.toString()); // prints "StackOverflow"
Object testobj2 = new Object();
System.out.println(testobj2.toString()); // prints "java.lang.Object@<Object.hashcode() in hex>"
我尝试使用:

System.out.println(testobj1.getClass().getName() + '@' + Integer.toHexString(testobj1.hashCode()));
但这也有与上述相同的问题。
hashCode()
方法也被
String
类覆盖,因此它正在执行
String
hashCode()
,而不是
对象的
hashCode()

是否可以调用重写方法而不是重写方法?

请注意:使用
String
类只是一个例子。不要假设对象始终是
字符串
对象

还假设:我无法访问类的源代码,因此我不能从类中删除
toString()
实现,也不能创建抽象类。这必须适用于任何对象(包括Java自己的类或任何API,如
String
HashMap
HttpServlet
,等等)。这也意味着我不是在寻找答案


你不能这样做

因为java总是使用重写方法


它的调用不被重写。这没有意义。您正在重写一个方法,因为您不需要使用父方法

您需要使用
System.identityHashCode()
来获取实际(原始)哈希代码

请尝试以下代码:

public static void main(String[] args) {
    String test = "StackOverflow";
    Object testobj1 = (Object) test;
    System.out.println(testobj1.toString()); // prints "StackOverflow"
    System.out.println(testobj1.getClass().getName() + '@' + Integer.toHexString(System.identityHashCode(testobj1)));
    System.out.println(test.getClass().getName() + '@' + Integer.toHexString(System.identityHashCode(test)));
    Object testobj2 = new Object();
    System.out.println(testobj2.toString()); 
    System.out.println(testobj2.getClass().getName() + '@' + Integer.toHexString(System.identityHashCode(testobj2)));
}
输出:

StackOverflow
java.lang.String@5d888759
java.lang.String@5d888759
java.lang.Object@2e6e1408
java.lang.Object@2e6e1408

够近了!完全忘记了那个方法。这不是一个通用的解决方案,但它可以恢复
Object.toString()的原始功能。
@ADTC-是的,是的。。重写的方法是动态调度的,所以我看不到任何其他方法。是的,但这对我来说是可行的,因为我只想复制
toString()
。但我想知道是否可以使用反射来实现通用解决方案?可能是杀伤力过大,但有可能吗?@ADTC-我不这么认为。。不管ypu如何封装它,在内部,该对象仍然是一个
字符串
。因此,字符串的
hashCode()
总是被调用。顺便说一句,你已经在这里使用反射了。
getClass().getName()
:尽管你编辑的答案直接回答了我的问题,但最后的答案解决了我的实际问题。我倾向于接受这一点。谢谢你的理解。实际上我已经不再问别人你为什么要这么做了?:你停下来问这个是什么
StackOverflow
java.lang.String@5d888759
java.lang.String@5d888759
java.lang.Object@2e6e1408
java.lang.Object@2e6e1408