认证高级PHP讲师
比如說生物和人 此時生物可以當做接口,人當做實現生物的抽象類,男人女人作為具體實現類,為什麼可以這樣設計?因為生物是個非常非常抽象的概念,你很難抽像出它的具體行為(也就是具體的方法實現),此時可以當做接口,人為何可以作為抽象類,因為他可以有具體的行為動作實現,例如,摸爬滾走,但是可能男人女人的性徵不一樣,同時可能還有一些公有的行為但是行為特徵不一樣這可以當做抽象類別的抽象方法,讓子類別實現。大概是這樣。
例如你有好多個類似的對象(想了半天,用別的詞不太合適),人也好,東西也好。他們的屬性幾乎都一樣,你就可以把它們抽象成一個類別。例如車類,有輪子、引擎、底盤、外殼等屬性。 new一個對象,來保存目前的屬性,可能你要把這些屬性保存到資料庫,也可能要顯示給用戶,當前的對象就是起了個保存資料的功能。物件不僅能保存數據,還可以有自己的方法,例如發動車。點選某個按鈕,呼叫目前物件的發動的方法。一般類別的方法都會跟資料的變化有關,我說的是一般,並不是所有。例如資料庫連接類,就不會改變數據,只是起到一個連接資料庫的作用。 介面一般來說是給外部呼叫的。你寫了一系列的方法,最終能完成一個有用的動作。這一系列的方法最開始的地方就是接口,你可以這麼理解。例如一個簡單登陸介面,你輸入使用者名稱密碼之後,點選確定就開始呼叫後台登入接口,把使用者名稱密碼傳給伺服器,伺服器端接收需要一個方法,接收之後要對密碼進行驗證,又是一個方法。驗證之後給客戶端回傳訊息。登入成功或失敗,這一系列動作完成。當然這些你可以壓到一個方法裡完成,總之開始的地方就是介面。 以上說法比較直白,並不完全準確。
介面表示一個能力/行為。例如:人會跑,狗也會跑,就可以定義介面IRunable。 使用介面很好實現組件間解耦。 抽象類別就是為了實現多型,讓程式碼更方便擴充。
介面就好像是100% 純天然的抽象類別。
介面的話更偏向於為一群類別定一個協議, 而抽象類別的話已經向實現邁進了一步。
例如模板方法模式中就用到了抽象類,實作了一些通用的方法, 而將不同的方法延遲到子類別再實作。
舉個簡單的例子,你現在想要抽象所有國家的人,那麼你會想到抽象成一個接口,然後有個方法叫sayHello:
sayHello
public interface Human{ String sayHello(); }
OK,現在每個實現了這個介面的物件只要實現sayHello方法,就表示了各國的人,他們擁有了不同的打招呼的的方式。
但是現在業務複雜起來了,你需要這些人還具備一些通用的能力,比如cry,walk,那么这个时候,你是不是应该考虑把Human抽象成為一個抽象類,像這樣:
cry
walk
Human
public abstract class Human{ public abstract String sayHello(); public String cry(){ System.out.println("wu~wu~wu~wu~wu~"); } public String walk(){ System.out.println("左右左 左右左"); } }
總結一下,就是如果只有抽象的方法,那麼就用接口,如果還有通用的具體方法實現,則用抽象類別
參考: Java™ 教學 :: Learngin The Java Language :: 介面與繼承 :: 繼承 :: 抽象方法與類別 :: 抽象類別與介面的比較
抽象類別用於抽象事物,介面抽象行為
此類定義統一操作,為物件提供方法
比如說生物和人 此時生物可以當做接口,人當做實現生物的抽象類,男人女人作為具體實現類,為什麼可以這樣設計?因為生物是個非常非常抽象的概念,你很難抽像出它的具體行為(也就是具體的方法實現),此時可以當做接口,人為何可以作為抽象類,因為他可以有具體的行為動作實現,例如,摸爬滾走,但是可能男人女人的性徵不一樣,同時可能還有一些公有的行為但是行為特徵不一樣這可以當做抽象類別的抽象方法,讓子類別實現。大概是這樣。
例如你有好多個類似的對象(想了半天,用別的詞不太合適),人也好,東西也好。他們的屬性幾乎都一樣,你就可以把它們抽象成一個類別。例如車類,有輪子、引擎、底盤、外殼等屬性。 new一個對象,來保存目前的屬性,可能你要把這些屬性保存到資料庫,也可能要顯示給用戶,當前的對象就是起了個保存資料的功能。物件不僅能保存數據,還可以有自己的方法,例如發動車。點選某個按鈕,呼叫目前物件的發動的方法。一般類別的方法都會跟資料的變化有關,我說的是一般,並不是所有。例如資料庫連接類,就不會改變數據,只是起到一個連接資料庫的作用。
介面一般來說是給外部呼叫的。你寫了一系列的方法,最終能完成一個有用的動作。這一系列的方法最開始的地方就是接口,你可以這麼理解。例如一個簡單登陸介面,你輸入使用者名稱密碼之後,點選確定就開始呼叫後台登入接口,把使用者名稱密碼傳給伺服器,伺服器端接收需要一個方法,接收之後要對密碼進行驗證,又是一個方法。驗證之後給客戶端回傳訊息。登入成功或失敗,這一系列動作完成。當然這些你可以壓到一個方法裡完成,總之開始的地方就是介面。
以上說法比較直白,並不完全準確。
介面表示一個能力/行為。例如:人會跑,狗也會跑,就可以定義介面IRunable。 使用介面很好實現組件間解耦。
抽象類別就是為了實現多型,讓程式碼更方便擴充。
介面就好像是100% 純天然的抽象類別。
介面的話更偏向於為一群類別定一個協議, 而抽象類別的話已經向實現邁進了一步。
例如模板方法模式中就用到了抽象類,實作了一些通用的方法, 而將不同的方法延遲到子類別再實作。
舉個簡單的例子,你現在想要抽象所有國家的人,那麼你會想到抽象成一個接口,然後有個方法叫
sayHello
:OK,現在每個實現了這個介面的物件只要實現
sayHello
方法,就表示了各國的人,他們擁有了不同的打招呼的的方式。但是現在業務複雜起來了,你需要這些人還具備一些通用的能力,比如
cry
,walk
,那么这个时候,你是不是应该考虑把Human
抽象成為一個抽象類,像這樣:總結一下,就是如果只有抽象的方法,那麼就用接口,如果還有通用的具體方法實現,則用抽象類別
參考:
Java™ 教學 :: Learngin The Java Language :: 介面與繼承 :: 繼承 :: 抽象方法與類別 :: 抽象類別與介面的比較
抽象類別用於抽象事物,介面抽象行為
此類定義統一操作,為物件提供方法