存在问题
如果我有类层次结构,如:
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()这样的东西不能编译......
答案 0 :(得分:21)
你不能,而且非常刻意这样:它会破坏封装。
假设您有一个类使用某个方法来验证某些业务规则的输入,然后调用超类方法。如果调用者可以忽略覆盖,那么这将使该类几乎没有意义。
如果您发现自己需要这样做,请重新审视您的设计。
答案 1 :(得分:3)
您可以添加另一种方法来调用超级字符串。类似的东西:
public string getSuperString(){
return super.toString();
}
答案 2 :(得分:3)
你可以
将方法添加到您调用的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 );
这两个选项都表明您的课程设计不佳,但有时您现有的课程只能以有限的方式进行更改。
答案 3 :(得分:1)
这是不可能的,因为A的toString()被B覆盖(我想,你的意思是“B级扩展A”)。
答案 4 :(得分:-1)
在你的代码中,如果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 );
}
}