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 方法
	}
相關文章
相關標籤/搜索