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

时间:2014-12-12 06:47:52

标签: java override superclass subclassing

  

请注意:我不是问如何强制所有类在其源代码中覆盖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,如StringStringtoString()等。这也意味着我寻找答案like these

2 个答案:

答案 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总是使用重写方法。

它不是调用重写方法。这没有意义。你正在覆盖一个方法,因为你不需要使用父方法。