在Java中扩展类时,可以通过super
引用来引用基类的成员。但是,当您拥有一个类A
,那个implements
和接口B
时,您只能以B
的方式引用B.super.method()
的方法。为什么在第二种情况下,super
关键字必须以B.
为前缀?
示例:
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."
}
}
答案 0 :(得分:9)
因为接口允许多重继承,这对于相同的方法可能造成歧义:
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???
}
}
答案 1 :(得分:6)
因为super.xyz()
在超类中查找(除了Object
之外您没有),而Type.super.xyz()
将在15.12.1. Compile-Time Step 1: Determine Class or Interface to Search中定义一个类或接口。 :
如果格式为
super . [TypeArguments] Identifier
,则要搜索的类是其声明包含方法调用的类的超类。
注意,未提及任何界面。
如果表单为
TypeName . super . [TypeArguments] Identifier
,则:[...]
否则,
TypeName
表示要搜索的接口I。