java中super關鍵字小結
在學習Java繼承的相關的知識的時候,我們會遇到子類父類之間的繼承關係,遇得到麻煩的向上塑形和向下塑形,自此總結一下,子父類繼承關係中的super關鍵字的用法:
首先總結一下super關鍵字的作用以及注意事項:
(1)呼叫父類的構造器(也成構造方法),在存在子父類繼承關係的時候,要例項化一個子類的物件,那麼必須要首先例項化其父類,就在這時super()表現了他的作用;
(2)super()只能出現在子類的構造器中,且必須寫在第一行;
(3)super()中的引數決定了,在子類物件例項化時,要呼叫父類的那個構造器為父類例項化;
(4)如果子類構造器中沒有super()出現,那麼編譯器則會預設加上super()即父類的空構造器(當然這空構造器可以是系統預設產生的那個),若此時父類中沒有空的構造器(即父類中聲明瞭一個有引數的構造器,使得系統不再生成預設的構造器),那麼編譯就會出錯;
(5)super關鍵字可以通過(super.父類引數)的方式來呼叫父類中的引數;
(6)注意,在同一個構造器中不能同時出現super關鍵字和this關鍵字!
下面是我寫的一個測試的程式程式碼:
package com.supertest; public class Test01 { int a; float b; double c; Test01(){ System.out.println("呼叫了Test01的無引數的構造器"); } Test01(int a,float b,double c){ this.a=a; this.b=b; this.c=c; System.out.println("例項化了Test01的構造方法"); } }
package com.supertest;
public class Test02 extends Test01{
String D;
Test02(){
System.out.println("呼叫了Test02的無引數的構造器");
}
Test02(int k,float m,double h,String D){
super(k,m,h);
System.out.println("呼叫了Test02的有引數的構造器");
}
}
package com.supertest; public class Test03 extends Test01{ public static void main(String[] args){ String G="b"; Test02 test02=new Test02(1,2,3,G); } }
以上的程式碼一方面是為了說明super關鍵字在,子父類繼承關係中的“指向和引導”(個人總結詞彙,僅供參考)作用,另外的一重的作用還有就是解決了我在寫super時候常常鬱悶的一個點,不知道大家看完有關super關鍵字的相關介紹的時候有沒有留意到這樣一個問題,當子類和父類的構造器都是有引數數的時候,那麼子類中的那個super(引數列表)中的引數該怎麼寫?
在此我先坦白自己最近一直犯的一個錯誤,就是一味的以為super()中的引數只要是有隨便宣告的就好,事實肯定不是這個樣子,看完上面我寫的程式碼,也許大家就會懂了,我在寫子類的有參構造器的時候,把父類的引數也同時宣告在了其中,然後在super中寫入了與父類有參構造器中的引數的型別相同的幾個引數。然後就是愉快的編譯通過了(至於中間嘗試的引數形式,在此就不多敘述了,有興趣的親可以親手試試),整個下來收穫了知識。
我的總結是:(存在繼承關係的前提下)在使用有參構造器例項化子類的物件時,需要為子類的構造器傳入引數,而在子類構造器發揮作用之前,父類的構造器也要使用引數進行例項化,所以需要同時傳入父類的引數的值,這也就解釋了我為何要在子類的有參構造器中寫入了父類構造器的引數了。(當然也可以不這麼做,另外一種方式把父類有引數構造器中的引數定義為static的變數,然後在super()中將其名稱寫入,也可以達到一樣的效果)