在我們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以后增加了默認方法的實現。而抽象類中添加了非抽象方法,子類只會享受其能力的擴展,不用擔心編譯出現問題。
簡單了解下抽象方法和接口,讓我們在編程的時候更加享受其特性帶來的方便。在選擇上可以有更多的選擇。