想象一下我有一个这样的课程:
public class Alpha {
int i = 5;
@Override
public String toString() {
return "Alpha [i=" + i + "]";
}
public String superToString() {
return super.toString();
}
}
然后我要做一个主要的:
Alpha o = new Alpha();
System.out.println(o.toString()); // display ==> Alpha [i=5]
System.out.println(o.superToString()); // display ==> pojos.Alpha@77468bd9
一切正常。现在,假设我在Alpha中没有名为superToString()的方法。有没有一种方法可以调用我的Alpha实例的父方法? (在此示例中,为Object的toString)
如果子类重写方法,则不再可能从另一个类调用重写的方法。无法解决此问题。
使用反射将无济于事:
var alpha = new Alpha();
var aMethod = alpha.getClass().getSuperclass().getMethod("toString");
System.out.printf("For method %s() in super class %s the call still results in \"%s\"%n",
aMethod.getName(), aMethod.getDeclaringClass().getSimpleName(),
aMethod.invoke(alpha));
结果:
For method toString() in super class Object the call still results in "Alpha [i=5]"
问题是,任何允许您执行此操作的机制都在根本上破坏了封装和抽象。
这被子类称为方法重写。类“ Alpha”具有重写方法“ toString”。如果未指定,则Class Object为默认超类。
您可以在重写的方法中捕获super的toString并将其追加/添加到响应中
@Override
public String toString(){
String superToString = super.toString();
return superToString + " -> Alpha [i=" + i + "]";
}