JavaRush /Java Blog /Random-TW /構造函數和普通方法的區別。
fog
等級 18

構造函數和普通方法的區別。

在 Random-TW 群組發布
建構函數是一種特殊方法,旨在初始設定物件欄位的值。 乍一看,物件建構函數與普通物件方法沒有太大區別。事實上,在建構函式內部,我們可以做常規物件方法中可以做的所有事情:將文字輸出到控制台、存取新物件的所有欄位和方法、拋出例外等等。就像常規方法一樣,建構函式可以有參數。就像重載方法一樣,可以有多個具有不同簽章的建構子。就像泛型方法一樣,建構函數可以透過類型變數進行參數化。即使我們查看編譯器產生的字節碼,在應該調用構造函數的地方,我們也會發現對某個方法的調用,其名稱與對其他方法的調用沒有什麼不同。物體<init>。找到該方法的字節碼後,我們會發現它包含編譯建構函數的結果。看似與傳統方法沒有太大區別,但它們是存在的,而且是相當顯著的。首先,讓我們弄清楚,為什麼我們實際上需要建構函數?為了儲存和處理任何數據,無論是原始類型、數組還是對象,我們都需要一定量的記憶體。這可以是處理器暫存器、堆疊空間或在流程資料部分中分配的一塊空間,或是在記憶體的動態分配部分(堆疊)中。在許多程式語言中,為了加速目的,當程式請求一塊新的記憶體時,該記憶體會被分配給未清除的程序,並且可以包含先前儲存在該記憶體單元中的任意資料。準備必要的值並將其寫入這樣的一塊記憶體中,以便最終在那裡出現一些有意義的資料結構,這完全落在了程式設計師的肩上。很自然地,程式設計師希望讓他們的生活更輕鬆,並編寫例程來初始化(即設定初始值)常用的資料結構。這類例程幾乎經常被使用,因此 Java 語言的創建者決定在建立物件時強制呼叫此類初始化例程,並將它們稱為建構函式。當在 Java 中建立新物件時,會發生以下情況:首先,Java 記憶體管理器分配容納該物件所需的記憶體量。在這種情況下,不僅會考慮在所建立物件的類別中直接聲明的字段,還會考慮在該類別的所有祖先中聲明的字段。此外,該磁碟區還包括用於放置 Java 機器用於內部所需的結構的空間。這種「空白」的所有欄位都會自動設定為預設值 -對於null引用類型、0數字和falseboolean。此後,會自動呼叫類別建構函數,其任務是設定物件欄位的初始值。雖然在普通方法中,第一個語句可以是任何內容,但建構函數的自由度要小得多。建構函數的第一個語句必須是對同一類別的另一個建構子的明確調用,或是對父類別的建構子的明確或隱式調用。this使用關鍵字後面跟著一組括在括號中的參數來明確呼叫同一類別的建構子。明確呼叫父類別的建構函數的方式完全相同,但使用了關鍵字super。在對相同類別或父類別的建構函式的明確呼叫的參數中,您無法存取物件的欄位和方法,也不能使用關鍵字and ,因為對建構函式的明確呼叫會引入靜態this上下文super。要隱式呼叫父類別的建構函數,不需要編寫任何內容,但會隱式呼叫預設建構函數,該建構函數必須存在且對目前類別可見。同時,應該記住,如果呼叫父建構函數的鏈在位於Object鏈頂部的類別構造函數成功完成其工作之前被中斷,那麼該物件將不會是可終結的,即該方法這樣一個物件的永遠finalize()不會被調用。父類別建構子完成後,控制權將隱式轉移到目前類別的實例初始值設定項區塊和實例欄位初始值設定項。初始化程序會依照它們在程式文字中出現的順序執行。只有在初始化程序完成其工作後,控制權才會轉移到建構函數的其餘部分。建構函數的其餘功能與 Java 記憶體模型有關。如果一個類別或其祖先之一重寫了該方法finalize(),則建構函數的完成將發生在該方法運行之前(發生之前finalize()) 。如果任何執行緒在建構函式完成後看到對物件的引用,則可以保證該執行緒將看到該物件final的正確初始化的字段,該物件的初始化發生在建構函式完成之前。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION