Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中如何访问超级类?[内部小示例]_Java_Super_Superclass - Fatal编程技术网

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

在Java中如何访问超级类?[内部小示例],java,super,superclass,Java,Super,Superclass,在下面的示例中,如何从C访问类A的方法method() 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(

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

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
    }
}
A类{
public void方法(){}
}
B类扩展了A类{
public void方法(){}
}
C类扩展到B类{
public void方法(){}
无效测试(){
method();//C.method()
super.method();//B.method()
C.super.method();//B.method()
B.super.method();//错误您不应该这样做

如果要访问
A
中的方法,请从
A
扩展,而不是从
B
扩展

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

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


所以,简而言之,不要这样做。

你不能——而且是故意的。这将违反封装。你将跳过
B.method
想要做的任何事情——可能验证参数(假设有),强制执行不变量等

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


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

好吧,没有直接的方法可以做到这一点,但您可以尝试解决方法

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

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


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


谢谢你的解释。我知道C++支持这个问题。有没有一个原因,java没有?@ TePaTeTyPyfF:我更想知道C++为什么对那些明显违反封装的东西有支持。你在那里做了有效的点,但是你的答案应该更强大。你真的不能,即使你哇。Java不允许这样做。我不知道你是否可以,所以我选择了安全的方法;说为什么不应该。看到Jon Skeet的答案,我很惊讶在我写这篇文章的时候,这个问题没有出现在相关的问题中。我的答案在那里。+1不是关于我是否应该。我想知道这是否可能,仅此而已。但是我知道不是。阻止我做我的工作(解决我们无法修复的其他代码中的bug)不是语言的工作@GlennMaynard:那么我建议你改变语言——也许是一种完全没有限制的语言……没有私有与公有的概念,没有封装的概念。任何限制都会让事情变得更加困难——但总体效果是积极的。我只是想知道这是否可能。但是,是的,创建一个w我也可以。我只是想知道这是否可行。但是的,那将是一个很好的解决办法。
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()
    }
}