Я надеюсь, что этот код объясняет проблему:
class Foo {
void a() { / *stuff */ }
}
class Bar extends Foo {
void a() { throw new Exception("This is not allowed for Bar"); }
class Baz {
void blah() {
// how to access Foo.a from here?
}
}
}
Я знаю, что могу делать что-то не так, потому что наследование, возможно, не должно использоваться таким способом. Но это - самый легкий путь в моей ситуации. И около этого мне просто любопытно. Действительно ли это возможно?
Bar.super.a ()
, похоже, работает.
Согласно раздел 15.12 JLS
ClassName. супер . Идентификатор NonWildTypeArguments_opt (ArgumentList_opt)
является допустимым вызовом метода
Вы можете вызвать любой метод из внешнего класса с помощью Outer.this.method ()
.
Но методы разрешаются во время выполнения, поэтому, если вы переопределили его в своем подклассе, только метод подкласса ( Bar.a ()
) может получить доступ к оригиналу (путем вызова super.a ()
).
Как вы, вероятно, обнаружили, вы не можете написать Bar.this.super.a ()
- но даже если бы вы могли, он все равно дал бы вам Bar.a ()
, а не Foo.a ()
.