《接口優(yōu)于抽象類》
Java中有兩種允許多種implements的類型:接口和抽象類。
最明顯的區(qū)別:
- 抽象類允許某些方法實現(xiàn)逞敷,接口不允許雅宾。
- 要實現(xiàn)抽象類定義的類型,類必須成為抽象類的子類鸭丛。Java只允許單繼承,所以抽象類作為類型定義受到了極大的限制唐责。
現(xiàn)有的類很容易被更新鳞溉,以實現(xiàn)新的接口。
如果你希望兩個類同時擴展一個抽象類鼠哥,就必須把抽象類放到type hierachy的高處熟菲。這會間接傷害到類層次。接口是定義mixin(混合類型)的理想選擇朴恳。
關(guān)于mixin接口抄罕,前面有一篇也提到過,Serializable這種就是mixin(顯著特點是它是一個空的接口)于颖,Comparable也是mixn呆贿,它之所以被稱作mixn,是因為「它允許任選的功能可以被混合到類型的主要功能中(comparable允許同樣的實例進行排序)森渐∽鋈耄」抽象類就不行,它不能被更新到現(xiàn)有的類中:類只能有一個父類同衣,沒有合適的地方插入mixin竟块。接口允許我們構(gòu)造非層次結(jié)構(gòu)的類型框架。
比如一個人可能同時是singer和songwriter耐齐,那么一個類可以同時實現(xiàn)它們浪秘。
如果使用抽象類定義類型前弯,只能通過繼承來增加功能。
骨架類
以下摘自:
http://www.reibang.com/p/5ebde8d00a23
眾所周知秫逝,java 8之前接口是不可以有方法體的恕出,這就是抽象類相對于接口的優(yōu)勢,為了將抽象類和接口的優(yōu)勢整合起來违帆,“骨架類”就誕生了浙巫,骨架類的做法是用一個抽象類來實現(xiàn)一個接口,在抽象類中為接口的某些方法提供實現(xiàn)刷后。
骨架類的實現(xiàn)的一般步驟是的畴,找出接口中的基本方法,在抽象類中聲明為抽象方法尝胆,然后用這些基本方法來實現(xiàn)其他方法丧裁,所謂基本方法,就是通過將這些方法組合或是變換含衔,可以實現(xiàn)其他的方法煎娇。
簡單的例子:
假設(shè)有一個接口,它可以實現(xiàn)一組對象的求和贪染,代碼如下:
public interface Summation<T> {
//實現(xiàn)兩個對象的相加
T towEleAdd(T obj01, T obj02);
//實現(xiàn)List求和
T listEleSum(List<T> list);
//實現(xiàn)數(shù)組求和
T arrayEleSum(T[] array);
}
觀察可以發(fā)現(xiàn)它的基本方法只有一個T towEleAdd(T obj01, T obj02);,現(xiàn)在我們可以來實現(xiàn)他的“骨架”了:
public abstract class AbstractSummation<T> implements Summation<T> {
@Override
public abstract T towEleAdd(T obj01, T obj02);
@Override
public T listEleSum(List<T> list) {
T firstEle = null;
for (T t : list) {
if (firstEle == null) {
firstEle = t;
continue;
}
firstEle = towEleAdd(firstEle, t);
}
return firstEle;
}
@Override
public T arrayEleSum(T[] array) {
T firstEle = null;
for (T t : array) {
if (firstEle == null) {
firstEle = t;
continue;
}
firstEle = towEleAdd(firstEle, t);
}
return firstEle;
}
}