抽象類:
如果一個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用 abstract 關(guān)鍵字修飾。因為抽象類中含有無具體實現(xiàn)的方法,所以不能用抽象類創(chuàng)建對象。抽象方法是一種特殊方法:它只有聲明,而沒有具體的實現(xiàn)。如果一個類繼承抽象類,那么就必須為基類中的抽象方法提供定義。如果不這么做,那導(dǎo)出類也為抽象類。
抽象類和普通類的區(qū)別:
- 抽象方法必須為 public 和 protected(如果為 private,子類無法繼承,子類便無法實現(xiàn)該方法),缺省情況下默認為 public。
- 抽象類不能用來創(chuàng)建對象。
- 如果一個類繼承于一個抽象類,則子類必須實現(xiàn)父類的所有方法。如果子類沒有實現(xiàn)父類的抽象方法,則必須將子類也定義為 abstract 類。
接口:
可以含有變量和方法。但要注意,接口中的變量會被隱式地指定為public static final變量(并且只能是public static final變量,用private修飾會報錯),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關(guān)鍵字private、protected、static、final等修飾會報錯),并且接口中的所有方法不能有具體的實現(xiàn),也就是說,接口中的方法必須都是抽象方法。從這里可以隱約看出接口和抽象類的區(qū)別,接口是一種極度抽象的類型,它比抽象類更加“抽象”,并且一般情況下不在接口中定義變量。
接口和抽象類的區(qū)別:
- 接口的方法默認是 public,所有方法在接口中不能有實現(xiàn)(Java 8 開始接口方法可以有默認實現(xiàn)),抽象類可以有非抽象的方法。
- 一個類可以實現(xiàn)多個接口,但最多只能實現(xiàn)一個抽象類。
- 接口中的實例變量默認是 final 類型,而抽象類中則不一定。
- 一個類實現(xiàn)接口的話要實現(xiàn)接口的所有方法,而抽象類不一定。
- 接口不能用 new 實例化,但可以聲明,必須引用一個實現(xiàn)該接口的對象。從設(shè)計層面來說,抽象是對類的抽象,是一種模板設(shè)計,接口是行為的抽象,是一種行為的規(guī)范。