请注意:我不是问如何强制所有类在其源代码中覆盖
toString()
。请仔细阅读问题。
java中的所有类都扩展了Object
类。如果任何类具有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>"
我需要的是致电testobj1
的{{1}}来实际执行toString()
班级的Object
方法。类似的东西:
toString()
我尝试使用:
System.out.println( [[testobj1 as Object]] .toString()); // prints "java.lang.String@<Object.hashcode() in hex>"
但这也有与上述相同的问题。 System.out.println(testobj1.getClass().getName() + '@' + Integer.toHexString(testobj1.hashCode()));
类也会覆盖hashCode()
方法,因此它正在执行String
的{{1}},而不是String
的{{1}}。< / p>
是否可以调用重写方法,而不是重写方法?
请注意:使用
hashCode()
类只是一个例子。假设对象始终是Object
对象,请不要将答案作为基础。还假设:我无法访问类的源代码,所以我不能从它们中删除
hashCode()
实现,或者执行创建抽象类的操作。这必须适用于任何对象(包括Java自己的类或任何API,如String
,String
,toString()
等。这也意味着我不寻找答案like these。
答案 0 :(得分:4)
您需要使用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
答案 1 :(得分:2)
你不能这样做。
因为java总是使用重写方法。
它不是调用重写方法。这没有意义。你正在覆盖一个方法,因为你不需要使用父方法。