Java 8 中的默认方法和多重继承

回忆的沙漏 2021-09-04 17:20:54 浏览数 (2414)
反馈

多重继承是一些面向对象的计算机编程语言的一个特性,其中一个对象或类可以从多个父对象或父类继承特性和特性。

Java 8 中的默认方法可以看作是一种多重继承的形式(除了属性不能被继承)。考虑下面的示例,​Button​ 类实现了两个接口 - ​Clickable​ 和 ​Accessible​。

默认方法-java-8

每个接口定义一个默认方法。因此,​Button​ 类可以从两个接口调用方法。这就像多重继承。

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();
	}
}

如果两个实现的接口都定义了一个具有相同方法签名的默认方法,那么实现类不知道使用哪个默认方法。实现类应该明确指定要使用的默认方法或定义它自己的方法。在下面的示例中,​Clickable​ 和 ​Accessible​ 都定义了 ​print()​ 方法。在 ​Button​ 类中,​print()​ 方法指定了默认方法。

default-methods-java-8-same-name

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();
	} 
}

默认方法背后的主要动机是,如果在某个时候我们需要向现有接口添加一个方法,我们可以在不更改现有实现类的情况下添加一个方法。这样,接口仍然兼容旧版本。这是一个很酷的功能。但是,我们应该记住使用默认方法的动机,并应该保持接口和实现的分离。


0 人点赞