如何从派生类外部调用super方法(即:toString())
存在的问题
如果我有一个类层次结构,如:
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()这样的东西不能编译……
你不能,也非常刻意这样:它会破坏封装。
假设您有一个类,它使用一种方法来validation某些业务规则的输入,然后调用超类方法。 如果调用者可以忽略覆盖,那么这将使该类几乎毫无意义。
如果您发现自己需要这样做,请重新审视您的设计。
你也可以
-
将方法添加到您调用的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 );
这两个选项都表明你的课程设计很糟糕,但有时你有现有的课程只能以有限的方式改变。
您可以添加另一种方法来调用超级字符串。 就像是:
public string getSuperString(){ return super.toString(); }
这是不可能的,因为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 ); } }