final欄位的初始化過程

2021-08-31 04:51:16 字數 743 閱讀 6661

首先final欄位是一經初始化就無法改變的。

其他屬性就不說了。

final分為static和非static的。

先說非static的final。

final int i = 10;

看下面的一段**:

class atest 

}

這裡呼叫的是構造器進行對final欄位初始化

問題出現了:類進行例項化的時候的先初始化變數也就是這裡的「i」;而在這裡i並沒有給予賦值。也就是一旦定義就無法改變其值。那豈不是和final的定義發生矛盾了嗎

其實不然,經過這幾天的摸索其實並不是這樣執行的:

在例項化atest類時。也就是

new atest();

時。執行了一系列過程。

1、對類atest進行載入——初始化atest類中的static域。而構造器也是靜態方法。所以會對構造器初始化。對構造器中成員i的值指向10;但不知道型別。其中10在靜態域中。i在棧中;

2初始化:先初始化變數(i)給i劃分int型別的空間。指向值10。

這樣就給final int i的值確定了。

對於static final 只有在static域中才能對其初始化。也就是載入類的時候開闢空間對其初始化。好理解

[b][color=darkred]我也是半猜。希望大家指出錯誤。[/color][/b]

Java 類內字段的初始化過程

4 4 成員初始化 6 9 初始化和類裝載 構建器的呼叫遵照下面的順序 1 呼叫基礎類構建器。這個步驟會不斷重複下去,首先得到構建的是分級結構的根部,然後是下乙個衍生 類,等等。直到抵達最深一層的衍生類。2 按宣告順序呼叫成員初始化模組。3 呼叫衍生構建器的主體。0.先初始化父類字段 1.先靜態字段...

類欄位初始化

對類的字段的初始化主要有以下三種方式 1.通過宣告對應字段直接給定該字段的初始值 此情況適用於所有的物件都具有乙個相同的值,或者都是有相同的形式的值 view code public class initiatefield 2.通過建構函式來設定類的字段的值 view code public cla...

c 使用初始化列表來初始化字段

includeusing namespace std class student1 student1 int i b i a b 異常順序 發現a的值為0 b的值為2 說明初始化僅僅對b有效果,對a沒有起到初始化作用 student1 int a,int b a a b b 正常順序 發現a b 2...