fed*_*evo 10 java compiler-construction
存在的问题
如果我有一个类层次结构,如:
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
}
}
Run Code Online (Sandbox Code Playgroud)
从main方法,当实例是B类时,是否可以调用A的toString?
当然,像o.super.toString()这样的东西不能编译......
Jon*_*eet 23
你不能,也非常故意这样:它会破坏封装.
假设您有一个类,它使用一种方法来验证某些业务规则的输入,然后调用超类方法.如果调用者可以忽略覆盖,那么这将使该类几乎毫无意义.
如果您发现自己需要这样做,请重新审视您的设计.
您可以添加另一个方法来调用超级字符串。就像是:
public string getSuperString(){
return super.toString();
}
Run Code Online (Sandbox Code Playgroud)
你可以
将方法添加到您要调用的A或B中。
// to A
public String AtoString() {
return toString();
}
// OR to B
public String AtoString() {
return super.toString();
}
Run Code Online (Sandbox Code Playgroud)将A.toString()的代码内联到“调用”位置
// inlined A.toString()
String ret = "I am A";
System.out.println( ret );
Run Code Online (Sandbox Code Playgroud)这两个选项都表明您的班级设计不佳,但是有时您现有的班级只能以有限的方式进行更改。
| 归档时间: |
|
| 查看次数: |
23785 次 |
| 最近记录: |