如何从派生类外部调用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 ); } }