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 方法 }