Java建構函式

2021-09-01 16:47:31 字數 2825 閱讀 8763

**)

類的繼承機制使得子類可以使用父類的功能(即**),並且子類也具有父類的型別。下面介紹類在繼承關係上的初始化的順序問題。 

示例1: 

class superclass  

} public class subclass extends superclass

public static void main(string args)

}

輸出結果:

superclass constructor 

subclass constructor 

在子類中只例項化了乙個子類物件。從輸出結果上看,程式並不是一開始就執行自己的構造方法,而是先執行其父類的預設構造方法。注意:程式自動呼叫其父類的預設構造方法。 

示例2: 

class superclass  

} public class subclass extends superclass

public static void main(string args)

}

在jdk下編譯此程式不能成功。正如上例中說的:程式在初始化子類時先要尋找其父類的預設構造方法,結果沒找到,那麼編譯自然不能通過。 

解決這個問題有兩個辦法: 

1.在父類中增加乙個預設構造方法。 

2.在子類的構造方法中增加一條語句:super(str); 且必須在第一句。 

這兩種方法都能使此程式通過編譯,但就本程式來說執行結果卻不相同。 

第1種方法的執行結果是:

sub with a string. 

第2種方法的執行結果是: 

super with a string. 

sub with a string. 

第2種解決方法實際上是指定編譯器不要尋找父類的預設構造方法,而是去尋找帶乙個字串為引數的構造方法。 

下面介紹物件的初始化順序問題。 

示例3: 

class one  

} class two

} public class test

}

輸出結果: 

test main() start... 

one-1 

one-2 

one-3 

two 

在main()方法中例項化了乙個two類的物件。但程式在初始化two類的物件時,並非先呼叫two類的構造方法,而是先初始化two類的成員變數。這裡two類有3個成員變數,它們都是one類的物件,所以要先呼叫3次one類的相應的構造方法。最後在初始化two類的物件。 

示例4: 

class one 

} class two

} public class test

}

輸出結果: 

test main() start... 

one-3 

one-1 

one-2 

two-1 

one-1 

one-2 

two-2 

如果乙個類中有靜態物件,那麼它會在非靜態物件前初始化,但只初始化一次。非靜態物件每次呼叫時都要初始化。 

示例5: 

class one  

} class two

3 }

public class test

}

輸出結果: 

one-3 

one-1 

one-2 

two-3 

test main() start... 

one-1 

one-2 

two-1 

one-1 

one-2 

two-2 

程式中主類的靜態變數會在main()方法執行前初始化。結果中只輸出了一次one-3,這也說明:如果乙個類中有靜態物件,那麼它會在非靜態物件前初始化,但只初始化一次。非靜態物件每次呼叫時都要初始化。 

示例6: 

class one  

} class two

} public class test

}

輸出結果: 

test main() start... 

one-2 

one-3 

two.i = 0 

不僅第1次建立物件時,類中所有的靜態變數要初始化,第1次訪問類中的靜態變數(沒有建立物件)時,該類中所有的靜態變數也要按照它們在類中排列的順序初始化。 

綜上所述:

在建立物件時,物件所在類的所有資料成員會首先進行初始化,如果其中的成員變數有物件,那麼它們也會按照順序執行初始化工作。在所有類成員初始化完成後,才呼叫物件所在類的構造方法建立物件。構造方法作用就是初始化。 

靜態物件(變數)在非靜態物件前初始化。靜態物件(變數)只初始化一次,再次呼叫就不初始化了,但非靜態物件在每次呼叫時都要初始化。 

程式中的主類的靜態變數會在main()方法執行前進行初始化工作。 

不僅第1次建立物件時,類中所有的靜態變數要初始化,第1次訪問類中的靜態變數(沒有建立物件)時,該類中所有的靜態變數也要按照它們在類中排列的順序初始化。 

初始化的順序包括構造方法呼叫的順序如下: 

1.主類的靜態成員首先初始化。 

2.主類的超類的構造方法按照從最高到最低的順序被呼叫。 

3.主類的非靜態物件(變數)初始化。 

4.呼叫主類的構造方法。 

在乙個構造方法中只能呼叫一次其它的構造方法,並且呼叫構造方法的語句必須是第一條語句。

Java 建構函式

1.建構函式的特點 1 和類名具有相同的名稱 2 沒有返回型別,注意這裡的沒有返回型別和void是不一樣的。3 不能在建構函式中寫帶有return的語句 2.建構函式的過載 建構函式一樣可以進行過載,根據引數列表的引數個數或者引數型別進行區分。3.建構函式的一些細節 1 當我們在乙個類中沒有寫建構函...

java 建構函式

1.建構函式 1 構造方法的方法名必須與類名相同。2 構造方法沒有返回型別,也不能定義為void,在方法名前面不宣告返回值資料型別。3 構造方法的主要作用是完成物件的初始化工作,它能夠把定義物件時的引數傳給物件。4 乙個類可以定義多個構造方法,如果在定義類時沒有定義構造方法,則編譯系統會自動插入乙個...

Java建構函式

物件一建立就會呼叫與之對應的建構函式。建構函式的作用 可以用於給物件進行初始化。建構函式的小細節 當乙個類中沒有定義建構函式時,那麼系統會預設給該類加入乙個空引數的建構函式。當在類中自定義了建構函式後,預設的建構函式就沒有了。建構函式和一般函式在寫法上有不同。在執行上也有不同。建構函式是在物件一建立...