存在问题
如果我有一个类层次结构,例如:
public class TestSuper {
public static class A {
@Override
public String toString() { return "I am A"; }
}
public static class B extends A {
@Override
public String toString() { return "I am B"; }
}
public static void main(String[] args) {
Object o = new B();
System.out.println( o ); // --> I am B
// ?????? // --> I am A
}
}
从main方法来看,当实例是B类型时,是否可以调用A的toString???
当然,像 o.super.toString() 这样的东西无法编译...
你不能,而且是故意这样做:这会破坏封装。
假设您有一个类,它使用一种方法通过某些业务规则来验证输入,然后调用超类方法。如果调用者可以忽略覆盖,那么该类几乎毫无意义。
如果您发现自己需要这样做,请重新审视您的设计。
您可以添加另一个方法来调用超级字符串。 比如:
public string getSuperString(){
return super.toString();
}
你可以
向 A 或 B 添加一个您可以调用的方法。
// to A
public String AtoString() {
return toString();
}
// OR to B
public String AtoString() {
return super.toString();
}
将 A.toString() 的代码内联到它被“调用”的位置
// inlined A.toString()
String ret = "I am A";
System.out.println( ret );
这两个选项都表明您的课程设计不佳,但是有时您现有的课程只能以有限的方式进行更改。
这是不可能的,因为 A 的 toString() 被 B 覆盖(我猜,你的意思是“B 类扩展 A”)。
在您的代码中这是不可能的,以防 B 扩展 A
public class TestSuper {
public static class A {
@Override
public String toString() { return "I am A"; }
}
public static class B {
@Override
public String toString() { return "I am B"; }
}
public static void main(String[] args) {
B b = new B();
System.out.println( b ); // --> I am B
A a = (A)b;
System.out.println( a );
}
}