Java 8引入了default methods来提供扩展接口的能力,而无需修改现有的实现。
我想知道,当一个方法被重写或者由于不同接口中的冲突默认实现而不可用时,是否可以显式调用该方法的默认实现。
interface A {
default void foo() {
System.out.println("A.foo");
}
}
class B implements A {
@Override
public void foo() {
System.out.println("B.foo");
}
public void afoo() {
// how to invoke A.foo() here?
}
}
考虑到上面的代码,如何从B类的方法调用A.foo()
?
7条答案
按热度按时间carvr3hs1#
根据this article,您可以使用以下命令访问接口
A
中的默认方法这可以如下使用(假设接口
A
和C
都有默认方法foo()
)A
和C
都可以有.foo()
方法,并且可以选择特定的默认实现,或者可以使用一个(或两个)作为新foo()
方法的一部分。您也可以使用相同的语法来访问实现类中其他方法的默认版本。方法调用语法的正式描述可以在JLS的第15章中找到。
waxmsbnn2#
这个答案主要是为来自问题45047550的用户编写的,该问题已关闭。
Java 8接口引入了多重继承的一些方面。默认方法有一个实现的函数体。要从超类调用方法,可以使用关键字
super
,但如果你想用超接口来实现,则需要显式命名它。输出:
你好家长班!
你好InterfaceFoo!
你好InterfaceBar!
q5iwbnjs3#
下面的代码应该可以工作。
输出:
ni65a41a4#
你不需要覆盖接口的默认方法。只要像下面这样调用它:
输出:
A.foo
ukqbszuj5#
这取决于你的选择是否要覆盖接口的默认方法。因为默认方法类似于类的示例方法,可以直接在实现类对象上调用。(简而言之,接口的默认方法由实现类继承)
hsgswve46#
考虑以下示例:
wb1gzix07#
调用Java8函数接口的默认方法