Java 8 - Interface Default Method接口默认方法

Java 8 相比于Java 7 推出了几大特点(features)(接口默认方法)default methods in interface, (接口静态方法)static method in interface, 函数编程(functional programming), lamda expression, stream API.java

这里首先介绍如下默认接口方法express


1。什么是默认接口方法编程

java 8 容许在接口定义并编写实现方法。例子:app

interface Collection{
	
	void add();
	
	void remove();
        
        //new feature in java 8 
        //default method
	default void put(){
		System.out.println("put the key in");
	}
}

由例子能够看出,java 8 添加新的关键字 default 用来实如今接口定义并实现一个方法。less


2。 为何须要默认接口方法ide

默认接口方法的语法很简单, 可是java 8 为什么须要引入这个新的概念却大有文章。函数

这里我举一个现实的例子, 如今咱们须要向一个叫collection的接口添加一个新的方法,而且全部实现这个接口的类均可以调用这个方法。 这个在java 7 是能够实现的不过须要向每一个实现这个接口的类从新重写override 这个方法。 这样其实很很差, 由于这里须要修改每一个实现接口类的方法。 否则没办法经过编译。ui

可是若是容许接口实现方法即(默认接口方法)能够很好解决这个问题。废话很少说先上例子:this

interface Collection{
	
	void add();
	
	void remove();
	
	//new requirement: project need add a new method
	//but we can't overrided the method in each implements classes
	//default method is to solve this problems
	default void put(){
		System.out.println("put the key in");
	}
}

class List implements Collection{

	@Override
	public void add() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void remove() {
		// TODO Auto-generated method stub
		
	}
	
}

public class WhyNeedDefault {

	public static void main(String[] args) {
		List list = new List();
		list.add();
		//now list have new method put
		list.put();
	}
}

 上面例子简单的利用接口默认方法为全部实现collection 接口的类添加的一个新的put方法.而且list 类不须要任何代码修改。最后list.put() 能够直接被调用。
spa


3 使用default interface method 须要注意的一些细节

3.1 当一个类实现多个接口而且多个接口都有相同的方法

假设:IDefaultMethods, IRegular 接口都有一个叫作 void talk()的方法

java8编译器会报错 若是FianlClass2 不重写override talk()方法

//error will show if IDM and IRr has the same method define unless overrided the talk method
public class FinalClass2 implements IDefaultMethods, IRegular{

	public static void main(String[] args) {
		
	}

	@Override
	public void move() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void talk() {
		// TODO Auto-generated method stub
		System.out.println("final class 2 talk method");
	}


3.2 当一个类继承一个类而且实现多个接口。这个父类和多个接口都有相同的方法

假设:ClassA, IDefaultMethods, IRegular 接口都有一个叫作 void talk()的方法

编译结果这个时候可能会另你们失望了,编译器没有报错即便finalclass4 不重写talk() 方法。

由于classA 会被优先调用talk()>接口方法talk()

//no error shows even FC4 not overrided the talk method
//error only happen if compiler can't figure out which method need to be called
public class FinalClass4 extends ClassA implements IDefaultMethods,IRegular{
		
	@Override
	public void move() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		
	}
	
	public static void main(String[] args) {
		FinalClass4 fc4 = new FinalClass4();
		fc4.talk();  //输出classA 的talk 方法
	}
相关文章
相关标签/搜索