這是我的讀書筆記,希望能夠對大家學習java有所幫助。所有代碼都經過測試,測試環境:
javaversion"1.4.0-rc"
Java(TM)2RuntimeEnvironment,StandardEdition(build1.4.0-rc-b91)
JavaHotSpot(TM)ClientVM(build1.4.0-rc-b91,mixedmode)如大家發現任何錯誤,或有任何意見請不吝賜教。缺省構造函數的問題:base類是父類,derived類是子類,首先要說明的是由于先有父類后有子類,所以生成子類之前要首先有父類。class是由class的構造函數constrUCtor產生的,每一個class都有構造函數,假如你在編寫自己的class時沒有編寫任何構造函數,那么編譯器為你自動產生一個缺省default構造函數。這個default構造函數實質是空的,其中不包含任何代碼。但是一牽扯到繼續,它的問題就出現了。假如父類baseclass只有缺省構造函數,也就是編譯器自動為你產生的。而子類中也只有缺省構造函數,那么不會產生任何問題,因為當你試圖產生一個子類的實例時,首先要執行子類的構造函數,但是由于子類繼續父類,所以子類的缺省構造函數自動調用父類的缺省構造函數。先產生父類的實例,
然后再產生子類的實例。如下:
classbase{
}
classderivedextendsbase{
publicstaticvoidmain(String[]args){
derivedd=newderived();
}
}下面我自己顯式地加上了缺省構造函數:
classbase{
base(){
System.out.}
}
classderivedextendsbase{
derived(){
System.out.println("derivedconstructor");
}
publicstaticvoidmain(String[]args){
derivedd=newderived();
}
}執行結果如下:說明了先產生baseclass然后是derivedclass。
baseconstructor
derivedconstructor我要說明的問題出在假如baseclass有多個constructor而derivedclass也有多個constructor,這時子類中的構造函數缺省調用那個父類的構造函數呢?答案是調用父類的缺省構造函數。但是不是編譯器自動為你生成的那個缺省構造函數而是你自己顯式地寫出來的缺省構造函數。
classbase{
base(){
System.out.println("baseconstructor");
}
base(inti){
System.out.println("baseconstructorinti");
}
}
classderivedextendsbase{
derived(){
System.out.println("derivedconstructor");
}
derived(inti){
System.out.println("derivedconstructorinti");
}
publicstaticvoidmain(String[]args){
derivedd=newderived();
derivedt=newderived(9);
}
}
D:/java/thinking/think6>javaderived
baseconstructor
derivedconstructor
baseconstructor
derivedconstructorinti假如將base類的構造函數注釋掉,則出錯。
classbase{
//base(){
//System.out.println("baseconstructor");
//}
base(inti){
System.out.println("baseconstructorinti");
}
}
classderivedextendsbase{
derived(){
System.out.println("derivedconstructor");
}
derived(inti){
System.out.println("derivedconstructorinti");
}
publicstaticvoidmain(String[]args){
derivedd=newderived();
derivedt=newderived(9);
}
}
D:/java/thinking/think6>javacderived.java
derived.java:10:cannotresolvesymbol
symbol:constructorbase()
location:classbase
derived(){
derived.java:13:cannotresolvesymbol
symbol:constructorbase()
location:classbase
derived(inti){
2errors新聞熱點
疑難解答