1. 程式人生 > >java 介面用法(通俗易懂)

java 介面用法(通俗易懂)

以前我一直沒有搞懂介面的工作流程,直到看了下面這篇文章:

很形象的介面的使用——針對初學者 
里氏代換原則是什麼?聽起來很高深,不過我們也不是什麼學院派,就不講大道理了,直接拿個例子來說一下。
我們拿人和程式設計師舉個例子。人是一個大類,程式設計師是繼承自人的子類。看看這句話:人需要吃飯。這句話我們把“人”換成“程式設計師”,就是:程式設計師需要吃飯,這樣換不會有什麼問題。現在我們反過來,把“程式設計師可以用計算機寫程式”裡邊的程式設計師換成“人”,就是:人可以用計算機寫程式。這樣就不一定正確了,否則問題可就大了,我們這些程式設計師只怕沒得飯吃了。
這個就是里氏代換原則:使用父類的地方肯定可以用它的一個子類來替換掉,但是使用一個子類的時候用它的父類來替換就不一定正確了。
好,現在我們回到程式設計裡邊來。
看看下面的程式:
一個學校裡邊,有兩種人:學生、老師。他們都要吃飯和睡覺。

public interface 人{
    void 吃飯();
    void 睡覺();
}
 
public class 學生 implements 人{
    public void 吃飯(){
        //去食堂吃飯
    }
    public void 睡覺(){
        //回寢室睡覺
    }
    ...//其他特有方法
}
 
public class 老師 implements 人{
    public void 吃飯(){
        //回家吃飯
    }
    public void 睡覺(){
        //回家睡覺
    }
    ...//其它特有方法
}
 
public class 學校{
    public void 開飯(人 ren){
        ren.吃飯();
    }
    public void 放學(人 ren){
        ren.睡覺();
    }
}
 
這裡就用到了里氏代換原則,"開飯()"和"放學()"的引數都是人,那麼這個地方如果換成學生和老師肯定也可以。
 
人 a = new 學生();
學校.開飯(a);
學校.放學(a);
 
這樣執行的結果就是學生回寢室吃飯。
 
人 b = new 老師();
學校.開飯(b);
學校.放學(b);
 
這樣執行的結果就是老師回家吃飯。
 
為什麼要這樣寫呢?這樣寫有什麼好處呢?
我在開飯的時候完全可以直接呼叫"學生.吃飯();"、"老師.吃飯();"啊。
接著看。
有一天,學校裡來了第三種人,家長。
家長既不是去寢室睡覺也不是回家睡覺,而是旅館睡覺,既不是去食堂吃飯也不是回家吃飯,而是去下館子。
這個時候學校這個系統該怎麼處理呢?
如果原來沒有定義"人"這個介面那就麻煩啦,所有用到人的地方程式碼都要改。
現在不一樣了,我可以直接定義一個類:家長,這個類實現人這個介面就可以了。
好,看程式碼:
 
public class 家長 implements 人{
    public void 吃飯(){
        //下館子
    }
    public void 睡覺(){
        //去旅館睡覺
    }
    ...//其它特有方法
 
在呼叫的時候不需要修改任何程式碼,還和原來一樣:
 
人 c=new 家長();
學校.開飯(c);
學校.放學(c);
 
輕鬆搞定家長的食宿問題!
 
這樣一來學校來再多的客人都沒關係啊,絕對可以應付自如,這也就是傳說中的可擴充套件性!
不知道初學者看到這裡是不是能夠明白介面的作用。如果你還不明白,那麼你把人這個介面去掉,自己寫一個學校開飯和放學的類,然後再加一個家長這個新新人類進去,看看你的程式碼是什麼樣子的,再想一下在人口這麼多的中國,萬一哪天你的學校裡來了成千上萬個新新人類你該怎麼辦!