如何在Java中访问超级超类?[里面的小例子]

Joh*_*oth 10 java super superclass

在下面的示例中,如何从类C的方法method()中访问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
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

在范围内不能访问类型B的封闭实例

答:不,这是不可能的.Java不允许它.类似的问题.

Jon*_*eet 17

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

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

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

  • @GlennMaynard:那我建议你改变语言 - 也许是一个没有任何限制的语言......没有私人与公共的概念,没有封装的概念.任何限制都必然会使事情变得更加困难 - 但整体效果是积极的. (7认同)
  • 阻止我完成工作并不是语言的工作(解决我们无法解决的其他代码中的错误). (5认同)
  • 这不是我是否应该.我想知道是否有可能,就是这样.但我发现事实并非如此. (3认同)

Mot*_*Mot 12

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

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()
    }
}
Run Code Online (Sandbox Code Playgroud)