1. 程式人生 > >菜雞的Java筆記 第三十五 介面定義增強

菜雞的Java筆記 第三十五 介面定義增強

介面定義增強
        在java從一開始到現在介面之中的核心組成部分:抽象方法與全域性常量,但是隨著技術的不斷髮展,使用者在使用過程之中發現了有一些問題
        如果說現在有一個介面經過了長年的使用,這個介面已經有了10W 個子類了,突然有一天你的老闆說,接口裡增加一個抽象方法
         並且要求這些介面子類的方法都一樣,如果不同,一個個實現,如果相同呢?實現到死
         那麼為了解決這樣的問題,從JDK1.8開始為接口裡面追加了兩種方法的定義: default 定義普通方法, static 定義靜態方法
        
         但是需要知道一點,即使介面之中提供有普通方法,這個介面也不能夠直接例項化,還是依靠子類完成
        
         範例:在介面中定義普通方法

package cn.mysterious;
interface IMessage{
    public String getMsg();
    public default void print(){// 必須使用 default
        System.out.println(this,getMsg());
    }
}
class MessageImpl implements IMessage{

    @Override
    public String getMsg() {
        // TODO Auto-generated method stub
        return
"hello world"; } } public class StudyLang { public static void main(String[] args) { // TODO Auto-generated method stub IMessage msg = new MessageImpl(); msg.print(); } }

           
        如果你在整個設計執行之前中間追加了抽象類的話,這樣的尷尬局面就不會有了
        除了 default 之外,也可以使用 static 定義靜態方法,而靜態方法的特點就是可以直接由類名稱負責呼叫
        
        範例:使用 static 定義靜態方法

package cn.mysterious;
interface IMessage{
    public String getMsg();
    public default void print(){ // 必須使用 default
        System.out.println(this,getMsg());
    }
    public static IMessage getInstance() {
        return new IMessage() { // 匿名內部類
            public String getMsg() {
                return null;
            }
        };
        
    }
}
class MessageImpl implements IMessage{

    @Override
    public String getMsg() {
        // TODO Auto-generated method stub
        return "hello world";
    }
    
}
public class StudyLang {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        IMessage msg = IMessage.getInstance();
        msg.print();
    }

}            

           
            使用 static 定義的方法可以由介面名稱直接呼叫