java中的構造方法的深入了解

2021-08-30 00:14:37 字數 2789 閱讀 6591

很長時間對與構造方法沒有很深的認識,但看過一篇介紹他的文章後感覺恍然大悟,故而把文章整理了一下收藏至此。

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

示例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 }

4 輸出結果:

test main() start...

one-2

one-3

two.i = 0

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

綜上所述:

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

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

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

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

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

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

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

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

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

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

java中的構造方法的深入了解

很長時間對與構造方法沒有很深的認識,但看過一篇介紹他的文章後感覺恍然大悟,故而把文章整理了一下收藏至此。類的繼承機制使得子類可以使用父類的功能 即 並且子類也具有父類的型別。下面 介紹類在繼承關係上的初始化的順序問題。示例1 class superclass public class subclas...

深入了解Java中「 」與「equals」的區別

1.比較的是物件或者基礎資料型別的位址是否相同 給出例子 son son1 new son son son2 new son system.out.println son1 son2 再來看 int a 3 int b 3 system.out.pritln a b 我們都知道結果是true,但是原...

深入了解 Go 語言的方法

方法主要源於 oop 語言,在傳統物件導向語言中 例如 c 我們會用乙個 類 來封裝屬於自己的資料和函式,這些類的函式就叫做方法。雖然 go 不是經典意義上的物件導向語言,但是我們可以在一些接收者 自定義型別,結構體 上定義函式,同理這些接收者的函式在 go 裡面也叫做方法。方法 method 的宣...