![]() |
|
Java構造器的使用方法 |
|
在Java程序中,每個類都必須至少有一個構造器(Constructor)。構造器是創建一個類的實例(對象)時需要調用的一個特殊的方法。 利用構造器可以產生一個類的實例,并且提供了一個地方用來定義創建類的實例時都需要執行的初始化(initialize)代碼。構造器的定義語法如下: <modifier> <class_name> ( [<argument_list>] ) 從上面的語法中可以看出,它和類中的方法定義很類似:可以有訪問修飾符modifier、有自己的方法名稱、有參數列表、有方法體,因此,可以將構造器當成一個特殊的方法(在許多資料里面,就是將Constructor稱為構造方法),這個方法的作用就是用來產生一個類的實例。但是要認識到構造器與普通方法的區別,主要表現在以下3個方面。 (1)修飾符:和方法一樣,構造器可以有任何訪問的修飾:public、protected、private或者沒有修飾。不同于方法的是,構造器不能有以下非訪問性質的修飾:abstract、final、native、static或者 synchronized。 (2)返回值:方法能返回任何類型的值或者無返回值(void),構造器沒有返回值,也不需要void。 (3)命名:構造器使用和類相同的名字,通常為名詞。而方法則不同,通常為描述一個操作的動詞。按照習慣,方法通常用小寫字母開始,而構造器通常用大寫字母開始。 下面定義一個用來表示"美食"的類Food。 源文件:Food.java public class Food { 在Food類中,定義了一個屬性food_name,還定義了一個構造器,在構造器中傳入一個字符串類型的參數,將參數值賦給屬性food_name。此時,就可以通過這個構造器來實例化這個類,如下所示。 Food myDinner = new Food("pizza"); 這樣,就得到了一個food_name名為"pizza"的實例,還可以再創建一個food_name名為"cola"的實例來搭配你的晚餐。 如果在程序中沒有定義任何的構造器,則編譯器將會自動加上一個不帶任何參數的構造器。默認的構造器不帶任何的參數,也沒有"方法體"。 通過上面的示例,在Food類中定義了一個帶一個參數的構造器。如果上面的Food類沒有定義構造器,則編譯器會自動加上一個構造器: public class Food { 所以,這時可以用下面的語句來實例化這個類: Food myDinner = new Food(); 如果在程序中定義了構造器,則編譯器將不再提供默認的構造器,即使定義的構造器同樣沒有參數。如果再使用默認構造器的話,編譯器會報錯。 使用Java 構造器中的一些注意事項: 1.首先要注意的是Java的構造器并不是函數,所以他并不能被繼承,這在我們extends的時候寫子類的構造器時比較的常見,即使子類構造器參數和父類的完全一樣,我們也要寫super就是因為這個原因。 2.構造器的修飾符比較的有限,僅僅只有public private protected這三個,其他的例如任何修飾符都不能對其使用,也就是說構造器不允許被成名成抽象、同步、靜態等等訪問限制以外的形式。 3.因為構造器不是函數,所以它是沒有返回值的,也不允許有返回值。但是這里要說明一下,構造器中允許存在return語句,但是return什么都不返回,如果你指定了返回值,雖然編譯器不會報出任何錯誤,但是JVM會認為他是一個與構造器同名的函數罷了,這樣就會出現一些莫名其妙的無法找到構造器的錯誤,這里是要加倍注意的。 4.構造器中一定不要創建自身的實例,否則會造成調用棧溢出錯誤。這個規則也適用于對象的實例變量,如果對象中有自身的引用,這個引用一定不能在定義中或者構造器中初始化。 5.如果父類是一個抽象類,那通過調用父類的構造器,也可以將它初始化,并且初始化其中的數據。 6.如果你要在構造器中調用一個方法時,將該方法聲明為private。 對于這個規則是需要一些說明的,假使你的父類構造器中要調用一個非靜態方法,而這個方法不是private的又被子類所重載,這樣在實際創建子類的過程中遞歸調用到了父類的構造器時,父類構造器對這個方法的調用就會由于多態而實際上調用了子類的方法,當這個子類方法需要用到子類中實例變量的時候,就會由于變量沒有初始化而出現異常(至于為什么子類中的實例變量沒有初始化可以參考上邊的實例初始化過程),這是Java不想看到的情況。而當父類構造器中調用的方法是一個private方法時,多態就不會出現,也就不會出現父類構造器調用子類方法的情況,這樣可以保證父類始終調用自己的方法,即使這個方法中調用了父類中的實例變量也不會出現變量未初始化的情況(變量初始化總是在當前類構造器主體執行之前進行) 熱點鏈接:
1、Java驅動在智能嵌入式設備上更具優勢 |