標籤:... stat code 不包含 auto 其他 static main net
抽象類別和介面,一直比較容易混淆,特性很類似,但是細節上又有不一樣,總結如下。
首先,要瞭解什麼是抽象方法。
抽象方法是只有方法聲明沒有方法體的方法用關節自abstract聲明,例如
1 abstract returnType funName(Type t1,type2,t2...);2 //例如3 abstract int help(int k);;
包含了抽象方法的類,一定是抽象類別。但是抽象類別中可以沒有抽象方法,也可以用自己的類變數(static修飾)和執行個體變數(非static 但是在類中方法體之外)。
抽象類別可以被繼承,但是不能通過new來執行個體化。以下看起來是可以通過new執行個體化了,實際上是產生了一個子類,把抽象方法實現了,子類執行個體化了,而且這個子類沒有名字。
也就是說 :
抽象類別其實是可以執行個體化的,但是他的執行個體化方式不是通過new方式來建立對象,而是通過父類的引用來指向子類的執行個體來間接地實現父類的執行個體化(因為子類要執行個體化前,一定會先執行個體化他的父類。這樣建立了繼承抽象類別的子類的對象,也就把其父類(抽象類別)給執行個體化了)
1 public abstract class BowlingGame { 2 public int a =1; 3 abstract int help(int k);; 4 5 //這種用法也叫做匿名內部類 6 public static void main(String args[]){ 7 BowlingGame bl = new BowlingGame(){ 8 9 @Override10 int help(int k) {11 // TODO Auto-generated method stub12 return 0;13 }};14 bl.a=3;15 System.out.println(bl.a);}
在使用抽象類別時需要注意幾點:
1、抽象類別不能被執行個體化,執行個體化的工作應該交由它的子類來完成,它只需要有一個引用即可。
2、抽象方法必須由子類來進行重寫。
3、只要包含一個抽象方法的抽象類別,該方法必須要定義成抽象類別,不管是否還包含有其他方法。
4、抽象類別中可以包含具體的方法,當然也可以不包含抽象方法。
5、子類中的抽象方法不能與父類的抽象方法同名。
6、abstract不能與final並列修飾同一個類。
7、abstract 不能與private、static、final或native並列修飾同一個方法。、
介面:介面是抽象的抽象,介面中全部是未實現的方法,允許建立者確定方法名,參數列表和傳回型別,但是沒有任何方法體。是一個極度抽象的類。用implement實現。java是單繼承的,只能繼承一個父類,但是卻可以實現多個介面。這也就是介面相對於抽象類別的優勢所在。
interface生來就是被實現的,所以他們預設就是public的啦。試想一下,把他們聲明成private protected,不能被實現了他們還有什麼意義!!
在使用介面過程中需要注意如下幾個問題:
1、個Interface的方所有法存取權限自動被聲明為public。確切的說只能為public,當然你可以顯示的聲明為protected、private,但是編譯會出錯!
2、介面中可以定義“成員變數”,或者說是不可變的常量,因為介面中的“成員變數”會自動變為為public static final。可以通過類命名直接存取:ImplementClass.name。
由可知成員變數預設是public static final
3、介面中不存在實現的方法。//抽象類別中可以有實現的方法,抽象類別中甚至可以沒有抽象方法
4、實現介面的非抽象類別必須要實現該介面的所有方法。抽象類別可以不用實現。
5、不能使用new操作符執行個體化一個介面,但可以聲明一個介面變數,該變數必須引用(refer to)一個實現該介面的類的對象。可以使用 instanceof 檢查一個對象是否實現了某個特定的介面。例如:if(anObject instanceof Comparable){}。
6、在實現多介面的時候一定要避免方法名的重複。
參考:http://blog.csdn.net/chenssy/article/details/12858267
java 抽象類別和介面