多重繼承是一些面向?qū)ο蟮挠?jì)算機(jī)編程語(yǔ)言的一個(gè)特性,其中一個(gè)對(duì)象或類可以從多個(gè)父對(duì)象或父類繼承特性和特性。
Java 8 中的默認(rèn)方法可以看作是一種多重繼承的形式(除了屬性不能被繼承)。考慮下面的示例,?Button
? 類實(shí)現(xiàn)了兩個(gè)接口 - ?Clickable
? 和 ?Accessible
?。
每個(gè)接口定義一個(gè)默認(rèn)方法。因此,?Button
? 類可以從兩個(gè)接口調(diào)用方法。這就像多重繼承。
interface Clickable{
default void click(){
System.out.println("click");
}
}
interface Accessible{
default void access(){
System.out.println("access");
}
}
public class Button implements Clickable, Accessible {
public static void main(String[] args) {
Button button = new Button();
button.click();
button.access();
}
}
如果兩個(gè)實(shí)現(xiàn)的接口都定義了一個(gè)具有相同方法簽名的默認(rèn)方法,那么實(shí)現(xiàn)類不知道使用哪個(gè)默認(rèn)方法。實(shí)現(xiàn)類應(yīng)該明確指定要使用的默認(rèn)方法或定義它自己的方法。在下面的示例中,?Clickable
? 和 ?Accessible
? 都定義了 ?print()
? 方法。在 ?Button
? 類中,?print()
? 方法指定了默認(rèn)方法。
interface Clickable{
default void click(){
System.out.println("click");
}
default void print(){
System.out.println("Clickable");
}
}
interface Accessible{
default void access(){
System.out.println("access");
}
default void print(){
System.out.println("Accessible");
}
}
public class Button implements Clickable, Accessible {
public void print(){
Clickable.super.print();
Accessible.super.print();
}
public static void main(String[] args) {
Button button = new Button();
button.click();
button.access();
button.print();
}
}
默認(rèn)方法背后的主要?jiǎng)訖C(jī)是,如果在某個(gè)時(shí)候我們需要向現(xiàn)有接口添加一個(gè)方法,我們可以在不更改現(xiàn)有實(shí)現(xiàn)類的情況下添加一個(gè)方法。這樣,接口仍然兼容舊版本。這是一個(gè)很酷的功能。但是,我們應(yīng)該記住使用默認(rèn)方法的動(dòng)機(jī),并應(yīng)該保持接口和實(shí)現(xiàn)的分離。