主要需要解決的問題:
- 繼承和接口的區別
- 抽象類和接口之間的區別?
- 什麼時候創建抽象類?什麼時候創建接口?
- 設計框架時該如何選擇?
1. 繼承和接口的區別
- 繼承不需重載所有方法,接口必須實現所有方法。
1.1 面向對象的角度
繼承是類的關係,接口實現是對行爲的實現。
舉個例子:
繼承是 人->女人。
接口是 女人 實現 生孩子(有xxxx,懷孕,分娩或下蛋等方法)
- 繼承只能是一個,而接口的實現可以是多個.
- 繼承的原意是希望得到父類的特性.而實現接口是對自身一個插入式的擴展
1.2 繼承和接口使用上的區別示例
- 談談你對抽象類和接口的理解
- 組合優於繼承
- 使用繼承得到人類的特性(eg:說話…),使用接口擴展每個人的特點(普通話、沭陽話…)
2. 抽象類和接口之間的區別
2.1 什麼是抽象類和接口
抽象方法 即使用 abstract
關鍵字修飾,僅有聲明沒有方法體的方法。
public abstract void f(); //沒有內容
抽象類 即包含抽象方法的類。
如果一個類包含一個或者多個抽象方法,該類必須被限定爲抽象的。抽象類可以不包含抽象方法。
public abstract class BaseActivity {
private final String TAG = this.getClass().getSimpleName(); //抽象類可以有成員
void log(String msg){ //抽象類可以有具體方法
System.out.println(msg);
}
// abstract void initView(); //抽象類也可以沒有抽象方法
}
接口 是抽象類的一種特殊形式,使用 interface
修飾。
public interface OnClickListener {
void onClick(View v);
}
2.2 特點與區別
抽象類的特點
抽象類的初衷是“抽象”,即規定這個類“是什麼”,具體的實現暫不確定,是不完整的,因此不允許直接創建實例。
- 抽象類是由子類具有相同的一類特徵抽象而來,也可以說是其基類或者父類
- 抽象方法必須爲 public 或者 protected(因爲如果爲 private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認爲 public
- 抽象類不能用來創建對象
- 抽象方法必須由子類來實現
- 如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法,如果子類沒有實現父類的抽象方法,則必須將子類也定義爲抽象類
- 抽象類還是很有用的重構工具,因爲它們使得我們可以很容易地將公共方法沿着繼承層次結構向上移動
接口的特點
Java 爲了保證數據安全性是不能多繼承的,也就是一個類只有一個父類。
但是接口不同,一個類可以同時實現多個接口,不管這些接口之間有沒有關係,所以接口彌補了抽象類不能多繼承的缺陷。
接口是抽象類的延伸,它可以定義沒有方法體的方法,要求實現者去實現。
- 接口的所有方法訪問權限自動被聲明爲 public
- 接口中可以定義“成員變量”,會自動變爲 public static final 修飾的靜態常量
- 可以通過類命名直接訪問:ImplementClass.name
- 不推薦使用接口創建常量類
- 實現接口的非抽象類必須實現接口中所有方法,抽象類可以不用全部實現
- 接口不能創建對象,但可以申明一個接口變量,方便調用
- 完全解耦,可以編寫可複用性更好的代碼
區別
-
抽象類它的作用就是:定義規範,強制子類符合標準;如果有調用抽象方法,也會制定執行順序的規則
-
抽象層次不同
- 抽象類是對類抽象,而接口是對行爲的抽象
- 抽象類是對整個類整體進行抽象,包括屬性、行爲,但是接口卻是對類局部行爲進行抽象
-
跨域不同
- 抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類
- 抽象類所體現的是一種繼承關係,考慮的是子類與父類本質“是不是”同一類的關係
- 而接口並不要求實現的類與接口是同一本質,它們之間只存在“有沒有這個能力”的關係
-
設計層次不同
- 抽象類是自下而上的設計,在子類中重複出現的工作,抽象到抽象類中
- 接口是自上而下,定義行爲和規範