在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()
methodMyCountingList
提供,使用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()
}
}