1. 程式人生 > >java1.8新特性之介面定義增強

java1.8新特性之介面定義增強

本篇重點:使用default和static定義介面方法

從java發展之初到今天已經經過了20多年的時間了,在這20多年的時間裡所有的java開發者都知道java中的介面是由全域性常量和抽象方法組成。但是從jdk1.8的時代這一組成改變了。

為什麼會改變?

如果說有某一個介面,這個介面隨著時間的發展已經產生了2w個子類。突然發現,這個接口裡的方法不足,應該再增加一個方法,而針對於所有不同的子類,這個方法的功能實現是完全一樣的。按照最初的做法應該在每一個子類上都實現這個新的方法,那麼就要修改2w個子類。

所以為了解決這樣的問題,允許在接口裡面定義普通方法了。但是要定義普通方法就必須明確的使用default

來進行定義。

定義default方法:

package com.wonglar.demo;

interface IMessage{
    public void print();  //介面中原始的方法

    default void fun(){   //這是一個普通方法
        System.out.println("很神奇的一個方法。。。。。");
    }
}

class MessageImpl implements IMessage{

    @Override
    public void print() {
        System.out.println("Hello World !"
); } } public class Demo { public static void main(String[] args) { IMessage m = new MessageImpl(); m.print(); m.fun(); //此方法是在介面中直接定義的 } }

除了使用default定義方法之外,還可以使用static定義方法,一旦使用了static定義方法,意味著這個方法只能由類名稱呼叫。

定義static方法:

package com.wonglar.demo;

interface
IMessage{
public void print(); //介面中原始的方法 default void fun(){ //這是一個普通方法 System.out.println("很神奇的一個方法。。。。。"); } //在介面中定義static方法 static void get(){ System.out.println("直接由介面呼叫!"); } } class MessageImpl implements IMessage{ @Override public void print() { System.out.println("Hello World !"); } } public class Demo { public static void main(String[] args) { IMessage m = new MessageImpl(); m.print(); m.fun(); //呼叫介面中的方法 IMessage.get(); //直接由介面呼叫 } }

在java1.8裡面還有一個重要的概念:內部類訪問方法引數的時候可以不加上final關鍵字,所有出現的這些新特性,完全打破了java已有的程式碼組成形式。

總結:
1、接口裡面使用default和static定義方法的意義是避免子類重複實現同樣的程式碼。
2、介面的使用還應該以抽象方法為主。