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

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

你不能,也非常故意这样:它会破坏封装.

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

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

  • 要在内存中获取实例地址(我猜你的意思是Object的hashCode),你可以在一个覆盖hashCode()方法的对象上调用System.identityHashCode()并得到你想要的东西.(仅用于调试目的) (2认同)

mrK*_*mrK 5

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

public string getSuperString(){
    return super.toString();
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,能够做到这一点将直接破坏封装,这是 Java 的基本思想。Java 不希望您能够访问层次结构中的对象,除非您应该这样做。您可以使用这样的方法或重新考虑您的设计。 (2认同)

Pet*_*rey 5

你可以

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