1. 程式人生 > >預設構造方法淺析

預設構造方法淺析

1、我們在定義一個類時,如果沒有為該類定義構造方法,系統會為之提供一個無參的預設構造方法;如果我們為該類自定義了一個帶引數的構造方法,那麼預設的構造方法將不會自動提供,下面的程式碼將不會通過編譯:
package com.bitnanke;
public class MyTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        OneClass a=new OneClass()

;//在類OneClass中沒有定義無參建構函式,無法通過編譯(1)
    }
}
class OneClass{
    OneClass(String name){
        System.out.println(name);
    }
}
在(1)處如果是要例項化一個帶引數的OneClass的物件,如:OneClass a=new OneClass(“bitnanke”) ;    此時不定義無參構造方法是可以通過編譯的,但通常情況下,為了在類的使用過程中減少錯誤,如果我們為類定義了帶引數的建構函式,最好同時顯式的定義無參建構函式,這樣做的另外一個好處是可以避免繼承它的子類出現錯誤,隨後將例示這個問題。

2、構造方法可以被過載,但不能被繼承。在子類的構造方法中,系統自動會在第一行加上super()呼叫父類的預設構造方法,如果父類有自定義帶引數的構造方法而沒有預設構造方法,那麼,在子類的構造方法中如果不呼叫父類的自定義構造方法就會編譯出錯,請看下面的程式碼:
class OneClass{
    OneClass(String name){
        System.out.println(name);
    }
}
class TwoClass extends OneClass{
    TwoClass(int a){
        super("bitnanke");//此處正常,顯式的呼叫父類提供的自定義構造方法,可以通過編譯
    }
    TwoClass(String a,int b){
        //此構造方法出錯,因為在該處系統會自動新增super(),而父類中由於自定義構造方法使系統沒有提供預設構造方法,呼叫super()當然無法通過編譯
    }
}
構造方法的執行總是“由上而下”的,會先執行父類的構造方法,其實預設構造方法作用是呼叫父類的預設構造方法,所有類都是Object的子類,因此係統在使用者沒有自定義構造方法時會自動提供預設構造方法。
子類有多個構造方法時,父類要麼沒有構造方法,讓系統自動提供預設構造方法,那麼在執行子類構造方法之前先執行父類的預設構造方法;要麼就提供一個顯式的構造方法供子類的構造方法呼叫。