Java基礎系列(十) 物件構造

2021-08-21 09:20:53 字數 1961 閱讀 8761

預設域初始化

如果在構造器中沒有顯式地給域賦予初值,如下這樣:

private string name;

private

double salary;

//預設域初始化

public

user()

那麼就會自動地賦為預設值:數值為0,布林值為false,物件為null,但是我們一般不建議這麼做,這樣會大大的增加了閱讀程式的難度,比如說上面的程式中,name被初始化為null,當我們呼叫乙個新建user物件的getname()方法,就會丟擲乙個空指標異常。所以,我們應該在初始化域的時候盡量不要採用預設值,而是賦予一些有意義的初始值。

無參構造

很多類都包含乙個無引數的建構函式,物件由無參建構函式建立的時候,它的狀態會被設定成適當的預設值,比如:

private string name;

private

double salary;

//無參構造,初始化值

public

user()

如果在編寫乙個類的時候忘記寫構造器,不用擔心,系統會提供乙個無參的構造器,這個構造器將所有的例項域都設定為預設值,但是需要注意一點,如果類中提供了至少乙個構造器,但是卻沒有提供無參構造,則在構造物件的時候沒有提供引數就會視為不合法。

也就是說,僅僅當類沒有提供任何構造器的時候,系統才會提供乙個無參的構造器,如果在編寫類的時候,給出了乙個構造器,如果想要使用new classname()來構造物件,就必須提供乙個預設的構造器(即不帶引數的構造器)。

顯式域初始化

當乙個類的所有構造器都希望把相同的值賦予某個特定的例項域時,我們可以在類定義中,直接將乙個值賦給這個特定的域:

class

user

當然,初始域也不一定非要是常量值,也可以呼叫方法對域進行初始化,比如我們使用方法來初始化user類的id,達到自動賦值的效果:

class user 

}

引數名

一般來說,我們在使用有引數的建構函式時,通常會用到this關鍵字用來區分例項域和引數名:

public

user(string name, double salary)

呼叫另乙個構造器

如果構造器的第乙個語句形如this(…),這個構造器將呼叫同乙個類的另乙個構造器,比如:

public

user(double s)

比如我們呼叫new user(3000)時候,user(double) 構造器將呼叫user(string, double)構造器。

採用著這種方式使用this關鍵字很有用,這樣對公共的構造器**部分只編寫一次即可。

初始化塊

在乙個類的宣告中,可以包含多個**塊。只要構造類的物件,這些塊就會被執行。比如:

class user 

public

user(string name, double salary)

public

user()

}

在這個例項中,無論使用哪個構造器構造物件,id域都在物件初始化塊中被初始化,首先執行初始化塊,然後才執行構造器的主體部分。

總結上面我們一共說了三種構造器,下面時呼叫構造器的具體處理步驟

所有資料域被初始化為預設值(0,false或null)

按照在類宣告中出現的次序,依次執行所有域初始化語句和初始化塊

如果構造器第一行呼叫了第二個構造器,則執行第二個構造器主體

執行構造器主體。

17 物件的構造

如果沒有賦初值,全域性儲存區的成員變數初始值系統預設為0,棧空間和堆空間上成員變數初始值系統預設為隨機數。從程式設計的角度,物件只是變數,c 中可以定義與類名相同的特殊成員函式 建構函式。建構函式沒有任何返回型別的宣告。建構函式在物件定義時自動呼叫。每個物件在使用之前都應該初始化,建構函式用於物件初...

11 物件的構造

目錄從程式設計的角度,物件只是變數,因此 問題 程式中如何對乙個物件進行初始化,使得不管在什麼地方建立類物件,其成員變數的初始值都為固定值?解決方案1 存在的問題 解決方案2 建構函式 示例 建構函式 注意 物件定義和物件宣告不同 建構函式的自動呼叫 class test test int v in...

8 1 物件基礎

知識梳理 1 js中沒有類的概念 只有物件 和php不同 2 建構函式 不需要 return 就可以返回值 學習目標 1 能夠說出為什麼需要物件 2 能夠使用字面量建立物件 3 能夠使用建構函式建立物件 4 能夠說出new的執行過程 5 能夠遍歷物件屬性 一 概念1 什麼是物件 1 物件一定是乙個具...