如何在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