如何从派生类外部调用super方法(即:toString())

时间:2011-06-17 13:20:16

标签: 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 
    }
}    

从main方法开始,当实例是B类时,是否可以调用A的toString

当然,像o.super.toString()这样的东西不能编译......

5 个答案:

答案 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 ); 
    }
}