1.概述
抽象類、抽象方法以及接口,這三個知識點是每個程序員必備的基礎,無論是在實際編程的時候,還是在面試的時候,都會出現這類問題,面試官很可能就會問你,interface和abstract的區別
當父類知道子類應該包含什么樣的方法,但無法確定子類如何實現這些方法;在分析事物時,會發現事物的共性,將共性抽取出,實現的時候,就會有這樣的情況:方法功能聲明相同,但方法功能主體不同,這時,將方法聲明抽取出,那么,此方法就是一個抽象方法。
2.抽象類小結
- 抽象類和抽象方法都必須用abstract修飾符來修飾,抽象方法不能有方法體
- 抽象類有構造器,但不能直接被實例化,要創建對象涉及向上轉型,主要是用于被其子類調用
- 抽象類中可以沒有抽象方法,但是有抽象方法的類必定是抽象類
- 抽象類中可以包含靜態方法
- 抽象類不能用final修飾
- 抽象類不能用private修飾
- 抽象類也是類,一樣是用來繼承的,接口與類才是實現關系
- 外部抽象類不能用Static修飾,但內部的抽象類可以使用static聲明
- 抽象類可以繼承抽象類,抽象派生類可以覆蓋基類的抽象方法,也可以不覆蓋。如果不覆蓋,則其具體非抽象派生類必須覆蓋它們
- 抽象類可以實現接口,可以把接口中方法映射到抽象類中作為抽象方法而不必實現,而在抽象類的子類中實現接口中方法
3.抽象類組成分析
普通類可以包含構造方法、普通方法、static方法、常量和變量等內容。而抽象類也是類,而且是一個特別的類,抽象類是指在普通類的結構里面選擇性的增加抽象方法并以abstract關鍵字將該類修飾,是的,每個抽象類不管有沒有抽象方法在其類結構中,abstract關鍵字非加不可。
1、抽象類必須使用abstract修飾符來修飾,抽象方法也必須使用abstract修飾符來修飾,抽象方法不能有方法體。
2、抽象類不能被實例化,無法使用new關鍵字來調用抽象類的構造器創建抽象類的實例。
3、抽象類可以包含成員變量、方法(普通方法和抽象方法都可以)、構造器、初始化塊、內部類(接 口、枚舉)5種成分。
4、抽象類的構造器不能用于創建實例,主要是用于被其子類調用。
5、抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類
6、abstract static不能同時修飾一個方法 (abstract方法沒有方法體不能直接調用,static方法可以直接調用,沖突)
4.不能共存的關鍵字
不能與抽象類(abstract)共存的關鍵字主要有三個,分別是final、private、static
1、final
final:抽象類不能用final修飾。因為抽象類一定要被abstract修飾,而且抽象類一定要被繼承否則該抽象類無意義。而被final修飾的類不能被繼承,也就是說不能有子類,所以二者沖突不能同時使用!
2、private
private: 抽象類不能用private修飾,只能用public或protected。首先要明確一點:被abstract修飾的類是為了讓非抽象子類看到并強制重寫。如果抽象類中有私有的抽象方法,那么該抽象方法不被子類所知,就無法被復寫。 而抽象方法出現的就是需要被復寫。
3、static
static:如果static可以修飾抽象方法,那么連對象都省了,直接類名調用就可以了。眾所周知,抽象方法是沒有方法體的,可見運行也就沒意義了。雖然外部抽象類不能用Static修飾,但內部的抽象類卻可以使用static聲明
//定義一個抽象類A
abstract class A{//定義一個內部抽象類Bstatic abstract class B{ //static定義的內部類屬于外部類public abstract void saoMethod();}
}
class C extends A.B{public void saoMethod(){System.out.println("======saoMethod方法執行了======");}
}
public class StaticDemo {public static void main(String[] args) {A.B ab = new C();//向上轉型ab.saoMethod();}
}
運行結果: saoMethod方法執行了
說白了抽象類的功能就是一個類定義模板的功能。
5.關于接口(interface)
接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。
接口中的方法定義默認為public abstract類型,接口中的成員變量類型默認為public static final。
6.抽象類與接口的區別
下面比較一下兩者的語法區別:
1.抽象類可以有構造方法,接口中不能有構造方法。
2.抽象類中可以有普通成員變量,接口中沒有普通成員變量
3.抽象類中可以包含非抽象的普通方法,接口中的可以有非抽象方法,比如deaflut方法
4.抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然 eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。
5.抽象類中可以包含靜態方法,接口中不能包含靜態方法
6.抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。
7.一個類可以實現多個接口,但只能繼承一個抽象類。
注意
有抽象方法不一定是抽象類,也可能是接口。抽象類不一定有抽象方法,可以有非抽象的普通方法。