如何在Java中访问超级超类?

How do I access the super-super class, in Java? [Mini-example inside]

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
    }
}

我得到的错误是

No enclosing instance of the type B is
accessible in scope

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


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

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

如果B提供的行为不适合C,则不应扩展它。不要这样滥用遗产。


下面的代码可能是一种解决方法(不好,但应该有效):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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()
    }
}


嗯,没有直接的方法可以做到这一点,但你可以尝试解决方法。

我不确定从类C访问类A中的方法的目的,但您始终可以掌握该方法。

您可以在类C中创建类A的实例,如果这看起来太简单,请尝试使用反射API…[链接文本][1]

极端爪哇


你不应该。

如果您想访问A中的方法,可以从A扩展,而不是从B扩展。

B扩展A时,它假定底层A对象不会以其他方式被操纵,而不是以它自己的方式。因此,通过直接访问A的方法,可以破坏B的功能。

例如,假设您有一个实现列表的类,MyList。现在,假设我们用另一个名为MyCountingList的类扩展这个列表,它覆盖add()remove()方法来计算添加/删除的元素。如果您绕过add()方法MyCountingList提供的方法,使用MyList提供的方法,那么您现在已经打破了MyCountingList的计数特性。

所以,简而言之,就是不要。