JDK8新特性 介面的變化--預設方法和靜態方法
本文主要是簡單的說明下jdk8出現的一個新特性–介面的增強。此次變化中,介面中某些方法也可以有方法體了。jdk8對於介面的設計,除了保留之前的版本記本特性外,還提供了兩個新的功能。除了抽象方法外,還可以有預設方法(default方法)和靜態方法(static方法),此兩個方法都可以擁有方法體。
新特性:預設方法 和 靜態方法
在介面中用default關鍵字修飾的,可以擁有方法體的函式,成為預設方法或者擴充套件方法
同時在介面中可以使用static修飾一個擁有方法體的函式,就是介面中也可以有靜態方法啦
如下:
public interface JDK8NewInterface {
//1.預設方法
default void testDefault()
{
System.out.println("I'm interface's default function");
}
//2.靜態方法
static void testStatic()
{
System.out.println("I'm interface's static function");
}
}
簡單應用
1.預設方法和靜態方法不需要一定在實現類中去重寫它們,當然,你也可以根據需要重寫他們
public class JDK8NewInterfaceImpl implements JDK8NewInterface {
//預設方法不一定需要重寫,你也可以根據需要重寫
}
2.當實現類繼承多個介面時,如果繼承的介面中擁有相同的預設方法和靜態方法時,我們需要重寫預設方法,而不需要重寫靜態方法。因為靜態方法可以通過類名直接呼叫,編譯器可以區分出來;而預設方法需要物件呼叫,當實現類繼承兩個介面中有相同的預設方法時,導致編譯失敗而導致實現類必須重寫此預設方法
public interface JDK8NewInterface2 {
//1.預設方法
default void testDefault()
{
System.out.println("I'm interface2's default function" );
}
//2.靜態方法
static void testStatic()
{
System.out.println("I'm interface2's static function");
}
}
//介面JDK8NewInterface和JDK8NewInterface2中都有testDefault,testStatic方法
public class JDK8NewInterfaceImpl implements JDK8NewInterface, JDK8NewInterface2 {
//預設方法不一定需要重寫,但實現的兩個介面中有相同的預設方法時,就需要重寫
public void testDefault()
{
System.out.println("I'm interfaceImpl's default function");
}
}
通過上述實踐,我們可以發現在介面中可以定義方法,可以在不破壞原來的實現這個類的所有類的原有結構,是在沒有打破現有的繼承體系的基礎上實現了介面增強。而此次推出的這個新方法,已在現有的java.util.Collection中添加了一些新的預設方法,比如這次新特性中推出的新的預設方法forEach(),steam()等。不過,不推薦用預設方法,我也沒有詳細去了解,不過要是你去設計api的一些介面設計和架構設計,可以深入瞭解下。
問題探討
介面中不能用預設方法重寫toString/hashCode/equals方法呢?toString等方法是Object物件的,我們知道java中所有物件都是繼承自Object物件,所以Object物件中有了toString物件的一般方法,而有個前提一個類實現了具體的一個實現方法,永遠優先於預設方法的執行。由於任何介面也因為是Object的一個“子類”,都因此有了toString方法的一個非預設的實現,你再去給介面預設重寫toString方法,實際上還是不會執行,而去執行Object父類的toString的非預設實現,顯然,在介面中用default關鍵字去重寫Object中toString等方法是沒有意義的,所以,編譯時就不能通過的。
由於新介面變化後,介面和抽象的異同顯然也是有所變化,當面試再次問起時,應該注意JDK版本的變化,在這裡就不列出其異同了。由於本人java水平有限,錯誤之處望指正