I hope this code explains the problem:
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?
}
}
}
I know that I may be doing something wrong, because inheritance perhaps shouldn't be used in such way. But it's the easiest way in my situation. And, beside that, I'm just curious. Is it possible?
Yes, you can call the methods of the superclass from static methods of the subclass (using the object of subclass or the object of the superclass).
So, in order to access a private method from outside the class, you need to call one of its public proxies, i.e. one of the public methods of the class which have access to the private method and act as an interface to it, which is what you're doing.
We can invoke the overridden method of the parent class with the help of the super keyword. super() is used for executing the constructor of the parent class and should be used in the first line in the derived class constructor.
Does a superclass have access to the members of a subclass? Does a subclass have access to the members of a superclass? No, a superclass has no knowledge of its subclasses.
Bar.super.a()
appears to work.
Per JLS section 15.12
ClassName . super . NonWildTypeArguments_opt Identifier ( ArgumentList_opt )
is a valid MethodInvocation
You can call any method from the outer class with Outer.this.method()
.
But methods are resolved at runtime, so if you have overridden it in your subclass, only the subclass method (Bar.a()
) can access the original (by calling super.a()
).
As you probably discovered, you can't write Bar.this.super.a()
-- but even if you could, it would still give you Bar.a()
, not Foo.a()
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With