在我們Java開發的過程中,接口使我們經常使用到。但是我們也會用到抽象類。那麼我們在開發的時,具體應該怎麼選擇呢?這兩者有什麼差別?我們今天就來學習下。
抽象類
抽象類顧名思義就是不能執行個體化的類,我們在建立的時候會使用abstract 來建立。在抽象類中含有無具體實作的方法,是以我們在使用的時候不能使用該類來建立對象。
抽象類在表面上普通的類沒有差別,可以有多個抽象方法,當然也可以沒有抽象方法。
抽象類的實作主要是為了提供代碼複用的目的。
抽象類前面的修飾除了abstract ,還有有public,protected,預設情況下是public。不能是private.不然子類不能繼承父類。
我們子類在繼承抽象類時,子類必須實作父類的抽象方法,否則 ,子類也必須定義為抽象類。
public abstract class Abstorct {
//方法聲明為抽象的。
public abstract void add();
}
public class AbstorctImpl extends Abstorct {
@Override
public void add() {
}
}
接口
程式設計中,接口我們經常使用,利用它達到API定義與實作分離的目的。
在Java中,是沒有多繼承這一實作的,但是我們可以使用接口來達到這個目的。友善我們去實作我們想要的目的。
接口中的變量總是被隐式指定為public static final 變量。 并且方法也是被隐式的定義為public abstract。接口中的方法必須都是抽象方法。
在java8以後,接口中也有了預設的實作方法。
//java集合中一個預設實作的方法。
public interface Collection<E> extends Iterable<E> {
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
}
兩者不同點
兩者一個是類一個是接口,從子類來實作或者繼承時,實作就不同,繼承類java中隻能單繼承。
抽象類是事務的抽象,比如我們對于一個動物的描述,人和猴都有相似的東西,可以抽象出來共同的特征。 抽象類 是一個 has-a的關系。接口是is-a的關系。比如猴是否能跳,能跳躍,那麼就能實作該接口,不能實作則不能實作。
接口中不能含有靜态代碼塊和靜态方法,但是抽象類是可以存在靜态代碼塊和靜态方法的。
接口中的成員變量預設是public static final 類型的。抽象函數中的成員可以是各個類型的。
我們在程式中如果對接口進行增加方法,那麼子類實作也得增加其實作方法 不可取,但是java8以後增加了預設方法的實作。而抽象類中添加了非抽象方法,子類隻會享受其能力的擴充,不用擔心編譯出現問題。
簡單了解下抽象方法和接口,讓我們在程式設計的時候更加享受其特性帶來的友善。在選擇上可以有更多的選擇。
原文釋出時間為:2018-07-01
本文作者:mengrui
本文來自雲栖社群合作夥伴“
LuckQI”,了解相關資訊可以關注“
”。