JDK1.8中介面的新特性
前言
昨天在牛客網做題,有一道題叫做在JDK8的環境下,介面能不能有具體的方法實現還是隻能有抽象方法。
當然原題是個選擇題,問法也不是這樣問的。如果是這樣問的,大家肯定都會想著是不是JDK8有更改了,接口裡不只是可以有抽象方法了,也可以有具體的實現了,是的,確實是這樣。我們今天就來看看下JDK8中介面的新特性。
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。
最後,當default方法和實現類繼承的父類的方法同名時,優先呼叫父類的方法。
strictfp關鍵字
今天在看default關鍵字的時候無意中發現了還有一個名為strictfp的關鍵字,這個關鍵字可是之前從來都沒有看過額。那今天碰到了就記錄一下吧,目前的場景還沒有用到過。
自Java2以來,Java語言增加了一個關鍵字strictfp
strictfp 的意思是FP-strict,也就是說精確浮點的意思。在Java虛擬機器進行浮點運算時,如果沒有指定strictfp關鍵字時,Java的編譯器以及運 行環境在對浮點運算的表示式是採取一種近似於我行我素的行為來完成這些操作,以致於得到的結果往往無法令你滿意。而一旦使用了strictfp來宣告一個 類、介面或者方法時,那麼所宣告的範圍內Java的編譯器以及執行環境會完全依照浮點規範IEEE-754來執行。因此如果你想讓你的浮點運算更加精確, 而且不會因為不同的硬體平臺所執行的結果不一致的話,那就請用關鍵字strictfp。
你可以將一個類、介面以及方法宣告為strictfp,但是不允許對介面中的方法以及建構函式宣告strictfp關鍵字。現在這句話就需要更改了,是不允許對介面中的抽象方法使用。