java--抽象類與接口,繼承與多態

1、Java抽象類中不能有靜態的抽象方法。
  抽象類是不能實例化的,即不能被分配內存;而static修飾的方法在類實例化之前就已經別分配了內存,這樣一來矛盾就出現了:抽象類不能被分配內存,而static方法必須被分配內存。所以抽象類中不能有靜態的抽象方法。
  定義抽象方法的目的是重寫此方法,但如果定義成靜態方法就不能被重寫。
2、接口中不能有靜態的抽象方法
  接口中的方法也只能是 public abstract修飾的,不能加上static。接口是不能實例化的,即不能被分配內存,而static修飾的方法在類實例化之前就已經別分配了內存,這樣一來矛盾就出現了:接口不能被分配內存,而static方法必須被分配內存。所以接口中不能有靜態的抽象方法。
3、抽象類不一定有抽象方法
  靜態static是屬於字節碼的。
  一個抽象類可以沒有抽象方法,使用abstract只是爲了不被實例化。
  以上兩點可以說明,靜態方法只要有字節碼存在就可以運行,所以抽象類中可以有靜態方法。
4、靜態和抽象不能共存在方法上
  因爲靜態屬於字節碼,不需要對象就可以運行;而抽象方法沒有方法體,運行沒有意義,所以不能共存。
分類: Java

******抽象類接口都可以有靜態變量,接口中publicstaticfinal,抽象類都可以。兩者都不能有靜態抽象方法,抽象類可以有靜態方法。接口不能有靜態方法。

抽象類可以沒有抽象方法,但是如果你的一個類已經聲明成了抽象類,即使這個類中沒有抽象方法,它也不能再實例化,即不能直接構造一個該類的對象。
如果一個類中有了一個抽象方法,那麼這個類必須聲明爲抽象類,否則編譯通不過。

抽象函數只有聲明無方法體,無實現,有大括號就算實現了。必須被繼承,類繼承抽象方法必須全部實現,也可繼續抽象類繼承不必實現。
用sbstract修飾的或者有抽象方法的即爲抽象類,有抽象方法必須被abstract修飾(不一定有抽象方法),必須被繼承,不一定全部被實現。如果父類定義了抽象構造,子類必須顯示調用,否則自動調用無參構造。

接口只能有抽象,不可有構造,也沒有普通變量,在接口中凡是變量必須是public static final
接口方法也只有聲明,沒有實現,沒有大括號
1)接口不能有構造方法或其他方法,抽象類可以有。
2)接口不能有方法體,抽象類可以有。
3)接口不能有靜態方法,抽象類可以有。
4)在接口中凡是變量必須是public static final,而在抽象類中沒有要求。
可以用來修飾接口中的方法
public, abstract, default, static
接口可以多繼承,類只能單繼承,類可以多實現接口。
抽象方法:只有聲明沒有定義,不一定用abstract。沒有括號。有大括號就已經實現。



繼承與重載的實際應用:
class A{
public String show(D d){return ("AD");}
public String show(A a){return ("AA");}
}
class B extends A{
public String show(B b){return ("BB");}
public String show(A a){return ("BA");}
}
繼承重寫重載函數=》參數是對象時,又符合的找符合的,不符合的找父類的。同時有父類和爺爺類,用父類。


繼承的初始化特點:
首先new了一個子類對象,那麼就要調用構造方法來初始化該子類對象,但是該類繼承自A,所以要先調用父類的構造方法,這裏通過super("B")顯示的調用了父類的帶參構造。執行父類的帶參構造前要先對父類中的對象進行初始化,對父類中的c成員進行初始化,調用了C類的無參構造,所以調用順序爲:
先調用C類的無參構造
再調用A類的帶參構造
最後調用調用子類的構造
總結:
父類靜態變量>父類B靜態代碼塊->子類靜態變量-》子類A靜態代碼塊->父類B非靜態代碼塊->父類B構造函數->子類A非靜態代碼塊->子類A構造函數


構造方法的繼承:

構造方法用來初始化類的對象,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變量和成員方法,但不繼承父類的構造方法)。因此,在創建子類對象時,爲了初始化從父類繼承來的數據成員,系統需要調用其父類的構造方法。如果沒有顯式的構造函數,編譯器會給一個默認的構造函數,並且該默認的構造函數僅僅在沒有顯式地聲明構造函數情況下創建。
1,父類無任何構造,子類無構,有參,無參,有兩參四種情況都會初始化時或調用子類構造時自動調用父類的默認無參。然後執行子類構造。
2,父類定義了無參構造,子類無構,有參,無參,有兩參四種情況都會初始化時或調用子類構造時首先調用父類的無參。當然可以在子類中super()來顯示調用。然後執行子類構造。
3,父類定義了有參和無參,那麼子類必須顯示調用有參初始化父類變量,否則執行2.
4,父類只定義了有參,這是不會有默認無參,也沒有無參,則必須顯示調用有參初始化父類變量,否則執行2,報錯。

構造原則如下:
1. 如果子類沒有定義構造方法,則調用父類的無參數的構造方法。
2. 如果子類定義了構造方法,不論是無參數還是帶參數,在創建子類的對象的時候,首先執行父類無參數的構造方法,然後執行自己的構造方法。
3. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數,父類沒有定義構造,則會調用父類的默認無參構造函數。
4. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數且父類自己提供了無參構造函數,則會調用父類自己的無參構造函數。
5. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數且父類只定義了自己的有參構造函數,則會出錯(如果父類只有有參數的構造方法,則子類必須顯示調用此帶參構造方法)。
6. 如果子類調用父類帶參數的構造方法,需要用初始化父類成員對象的方式,比如:
[cpp] view plain copy



super,this問題。
0,顯示調用父類有參構造,否則調用無參構造,沒有則編譯錯誤
1,this用於本類形參實參名相同時,用於指代實參,或成員方法,然可省略。
2,super可以在子類調用父類的成員或者方法
super(參數):調用父類中的某一個構造函數(應該爲構造函數中的第一條語句)。
this(參數):調用本類中另一種形式的構造函數(應該爲構造函數中的第一條語句)。
3,構造時,this(),this(a),super(無參),super(a);
4,構造函數中默認的第一條語句是super(),super()與this()不能同時出現在一個構造函數裏,因爲都必須是第一條語句
5,都不能在static中,是指對象的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章