天天看點

java-OOP-抽象類和接口

抽象方法是一種特殊的方法:它隻有聲明,而沒有具體的實作

如果一個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用abstract關鍵字修飾。因為抽象類中含有無具體實作的方法,是以不能用抽象類建立對象。

隻是用abstract修飾的話也是抽象類。也就是說抽象類不一定必須含有抽象方法。(有點雞肋了)

包含抽象方法的類稱為抽象類,但并不意味着抽象類中隻能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。

抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實作該方法),預設情況下預設為public。

抽象類不能用來建立對象;

如果一個類繼承于一個抽象類,則子類必須實作父類的抽象方法。如果子類沒有實作父類的抽象方法,則必須将子類也定義為為abstract類。(還是乖乖實作吧)

從設計角度講抽象類屬于is-A 的關系

interface,在軟體工程中,接口泛指供别人調用的方法或者函數。從這裡,我們可以體會到Java語言設計者的初衷,它是對行為的抽象。

接口中的變量會被隐式地指定為public static final變量(并且隻能是public static final變量,用private修飾會報編譯錯誤),而方法會被隐式地指定為public abstract方法且隻能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤)接口中的方法必須都是抽象方法。

接口可以說是極度的抽象,是特殊的抽象類。并且一般情況下不在接口中定義變。

抽象類可以提供成員方法的實作細節,而接口中隻能存在public abstract 方法;

抽象類中的成員變量可以是各種類型的,而接口中的成員變量隻能是public static final類型的;

接口中不能含有靜态代碼塊以及靜态方法,而抽象類可以有靜态代碼塊和靜态方法;

一個類隻能繼承一個抽象類,而一個類卻可以實作多個接口。

抽象類是對一種事物的抽象,即對類抽象,而接口是對行為的抽象。

抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。

抽象類作為很多子類的父類,它是一種模闆式設計。而接口是一種行為規範,它是一種輻射式設計。對于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實作,子類可以不進行變更;而對于接口則不行,如果接口進行了變更,則所有實作這個接口的類都必須進行相應的改動。

繼續閱讀