如何在 Java 中访问超超类?[内部小示例]

2022-09-03 10:03:25

在下面的示例中,如何从 中访问类的方法?Cmethod()A

class A {
    public void method() { }
}

class B extends A{
    public void method() { }
}

class C extends B{
    public void method() { }

    void test() {
        method();          // C.method()
        super.method();    // B.method()
        C.super.method();  // B.method()
        B.super.method();  // ERROR <- What I want to know
    }
}

我得到的错误是

在作用域中无法访问 B 类型的封闭实例

答:不,这是不可能的。Java不允许这样做。类似的问题


答案 1

你不能 - 而且非常刻意。这将违反封装。你会跳过任何想做的事情 - 可能验证参数(假设有的话),强制不变量等。B.method

如果任何派生类可以跳过它所定义的任何行为,你怎么能指望对它的世界保持一致的看法呢?B

如果 B 提供的行为不适合 C,则不应扩展它。不要试图像这样滥用继承。


答案 2

以下代码可能是一个解决方法(不是很好,但应该工作):

class A {
    public void method() { }
}

class B extends A {
    public void method() { }
    protected void superMethod() {
         super.method();
    }
}

class C extends B {
    public void method() { }

    void test() {
        method();          // C.method()
        super.method();    // B.method()
        superMethod();     // A.method()
    }
}

推荐