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

问题描述 投票:0回答:5

存在问题

如果我有一个类层次结构,例如:

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() 这样的东西无法编译...

java
5个回答
27
投票

你不能,而且是故意这样做:这会破坏封装。

假设您有一个类,它使用一种方法通过某些业务规则来验证输入,然后调用超类方法。如果调用者可以忽略覆盖,那么该类几乎毫无意义。

如果您发现自己需要这样做,请重新审视您的设计。


9
投票

您可以添加另一个方法来调用超级字符串。 比如:

public string getSuperString(){
    return super.toString();
}

6
投票

你可以

  • 向 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 );
    

这两个选项都表明您的课程设计不佳,但是有时您现有的课程只能以有限的方式进行更改。


2
投票

这是不可能的,因为 A 的 toString() 被 B 覆盖(我猜,你的意思是“B 类扩展 A”)。


-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 ); 
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.