JDK8中接口的新特性
在JDK8環境中,接口中的方法不再是隻能有抽象方法,他可以有靜态方法和default方法。
package com.wangcc.MyJavaSE.jdk8interface;
public interface NewInterface {
static void staticMethod() {
System.out.println("staticMethod");
}
default void defaultMethod() {
System.out.println("defaultMethod");
}
public void getInfo();
}
給出一個接口,在JDK8的環境下,他可以擁有靜态方法和default方法,所謂default方法既是使用default關鍵字來修飾的方法。一個接口可以有多個靜态方法和default方法,沒有個數限制。
package com.wangcc.MyJavaSE.jdk8interface;
public class SimpleImpl implements NewInterface {
@Override
public void getInfo() {
// TODO Auto-generated method stub
System.out.println("INFO");
defaultMethod();
}
實作類隻需要實作它的抽象方法即可,JDK8中的接口愈發的像抽象類靠攏的感覺。
package com.wangcc.MyJavaSE.jdk8interface;
import org.junit.Test;
public class NewInterfaceTest {
@Test
public void test() {
NewInterface.staticMethod();
new SimpleImpl().defaultMethod();
}
}
關于靜态方法和default方法的調用。
對于靜态方法,并沒有特殊的地方,在接口中直接由接口名調用,不需要由接口實作類對象來調用。
而對于default方法,很明顯是需要實力對象來調用的。而且有一點需要特别注意。
我們知道在Java中是單繼承的,但是是可以實作多個接口的,是以,當一個類實作了多個接口之後,如果多個接口有着相同的default方法,即方法名和參數清單相同。那麼此時就會出現問題,無法識别到底是調用的哪個接口的方法,這個時候就必須要在實作類裡面顯式重寫default的方法,而關于default的方法的重寫,我們在實作類中不需要繼續出現default關鍵字也不能出現default關鍵字。
package com.wangcc.MyJavaSE.jdk8interface;
public class SimpleImpl implements NewInterface {
@Override
public void getInfo() {
// TODO Auto-generated method stub
System.out.println("INFO");
defaultMethod();
}
public void defaultMethod() {
System.out.println("Impl default Method");
}
}
重寫的default方法必須的通路權限必須是public,因為default方法除了沒有顯式的通路修飾符外,隻能用public通路限定符來修飾,而我們知道在Java中,要重寫一個方法,通路限定符一定要大于父類或者接口指定的通路限定符範圍,而且方法聲明處抛出的異常也要大于後者。是以通路權限必須是public。