似乎您对
default方法的存在感到困惑。因此,让我们暂时忘记这
IFace1.printHello()是一种
default方法。因此,有一个明显的情况:
Test实现两个接口
IFace1和
IFace2,它们碰巧具有一个具有相同名称和签名的方法。
Test实现该方法,因此对两个接口都实现了该方法。
default方法的新功能不会改变此逻辑。而且,语言设计者要注意,添加
default方法不会影响现有代码的行为,因此,如果您的类实现了该方法,则方法的存在将
default变得无关紧要。
但是,如果编写的代码知道方法的存在
default,则可以调用它,如果它是由直接超级接口声明或继承的,即可以在代码
IFace1.super.printHello()中调用的
default方法
IFace1。
这些规则与超类的规则没有太大不同。如果更改接口以使接口
IFace2扩展
IFace1并仍声明
printHello()为
abstract方法,则此
abstract方法会覆盖该
default方法,并且您将无法再
IFace1.super.printHello()从内部进行调用
Test。
如前所述,这些规则与普通实例方法没有太大不同。如果
Test声明了一个方法
printHello(),那是 唯一的
,你可以通过一个参考调用方法
Test的实例,其声明的类型,无论是
Test,
IFace1还是
IFace2。只有
Test其自身的实现方法才可以执行
super调用。
当涉及到接口的可能的多重继承时,主要区别就发挥了作用。如果你的类
Test没有 不
实施该方法
printHello(),它取决于两个接口的继承关系,会发生什么
- 如果
IFace2
extendsIFace1
,它是抽象方法,则重新声明该default
方法,因此会发生编译器错误,因为Test
必须实现该abstract
方法 - 如果
IFace2
不扩展IFace1
,则有两个具有相同名称和签名的可继承方法,因此Test
将不会继承该default
方法,并且会发生编译器错误,因为Test
必须实现该abstract
方法 - 如果
IFace1
extendsIFace2
,Test
将继承该default
方法。如果Test
未实现IFace2
,它也会继承它,但这应该令人惊讶……



