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

时间:2011-01-15 08:33:42

标签: 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
    }
}

我得到的错误是

  

没有类型B的封闭实例   可在范围内访问

答案:不,这是不可能的。 Java不允许它。 Similar question

4 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分: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()
    }
}

答案 2 :(得分:2)

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

我不确定从C类访问A类中的方法的目的,但您总能掌握该方法。

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

Extreme Java

答案 3 :(得分:1)

你不应该。

如果您想访问A中的方法,请从A而不是B延伸。

B扩展A时,它会假定基础A - 对象不会以其他方式操纵,而不会以其自身的方式进行操作。因此,通过直接访问A的方法,您可能会破坏B的功能。

想象一下,例如,你有一个实现列表的类MyList。现在,假设我们使用另一个名为MyCountingList的类扩展此列表,该类会覆盖add()remove()方法来计算要添加/删除的元素。如果您绕过提供的add()方法MyCountingList,则使用MyList方法,您现在已经破坏了MyCountingList的计数功能。

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