When you extend a class in Java you can refer to base class' members through the super
reference. However when you have a class A
, that implements
and interface B
, you can only refer to B
's methods in this way B.super.method()
. Why does the super
keyword in the second case have to be prefixed with B.
?
Example:
interface Runner {
default void run() {
System.out.println("default Runner::run");
}
}
static class RunnerImpl implements Runner {
public void run() {
Runner.super.run(); // doesn't work without "Runner."
}
}
Because interfaces allow multiple inheritance, which can result in ambiguity for identical methods:
interface Runner1 {
default void run() {
System.out.println("default Runner1::run");
}
}
interface Runner2 {
default void run() {
System.out.println("default Runner2::run");
}
}
static class RunnerImpl implements Runner1, Runner2 {
public void run() {
super.run(); // which one???
}
}
Because super.xyz()
looks in the superclass (which you don't have, besides Object
) and Type.super.xyz()
will look for a class or interface, as defined in 15.12.1. Compile-Time Step 1: Determine Class or Interface to Search:
If the form is
super . [TypeArguments] Identifier
, then the class to search is the superclass of the class whose declaration contains the method invocation.
Notice, no interface mentioned.
If the form is
TypeName . super . [TypeArguments] Identifier
, then:[...]
Otherwise,
TypeName
denotes the interface to be searched, I.
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