1. 程式人生 > >static final的初始化與賦值問題

static final的初始化與賦值問題

1.Class 檔案的生成階段

Sun javac編譯器對於靜態field欄位的初始化賦值策略
目前的Sun javac編譯器的選擇是:
1.如果使用final和static同時修飾一個field欄位,並且這個欄位是基本型別或者String型別的,那麼編譯器在編譯這個欄位的時候,會在對應的field_info結構體中增加一個ConstantValue型別的結構體在賦值的時候使用這個ConstantValue進行賦值
2.如果該field欄位並沒有被final修飾,或者不是基本型別或者String型別,那麼將在類構造方法cinit>()中賦值。

對於上述的public static final init MAX=100; javac編譯器在編譯此field欄位構建field_info結構體時,除了訪問標誌、名稱索引、描述符索引外,會增加一個ConstantValue型別的屬性表。

2.類載入階段(連結(準備階段))

如果類欄位的欄位屬性表中存在ConstantValue屬性,即同時被final和static修飾,那麼在準備階段變數value就會被初始化為ConstValue屬性所指定的值。 假設上面的類變數value被定義為: public static final int value = 3; 編譯時Javac將會為value生成ConstantValue屬性,在準備階段虛擬機器就會根據ConstantValue的設定將value賦值為3。
順便講一句:static final 與final static 只是使用的習慣問題 ,沒有 差別

相關推薦

static final初始問題

1.Class 檔案的生成階段 Sun javac編譯器對於靜態field欄位的初始化賦值策略 目前的Sun javac編譯器的選擇是: 1.如果使用final和static同時修飾一個field欄位,並且這個欄位是基本型別或者String型別的

Effective C++筆記之一:宣告、定義、初始

一.宣告(Declaration)        區分宣告和定義可以讓C++支援分開編譯,宣告常常見於標頭檔案中。原始檔包含標頭檔案之後,就可以使用這個變數,即使沒有看到該變數的定義。 宣告的語法如下: extern int i; // object decl

關於全域性變數初始問題的思考

    無意中在程式中遇到了一個問題,簡化程式效果如下: #include <iostream> using namespace std; string temp_String; temp_String = "hello"; int _tmain(int

C語言中字元陣列的初始

1.字元陣列初始化 在C語言中,字串是當做字元陣列來處理的;所以字串有兩種宣告方式,一種是字元陣列,一種是字元指標。 字元陣列初始化 char parr[] = "zifuchuanshuzu"; char charr[] = { 'z','i',

2.1詳解變數的定義、初始

在前的課程中我們談到,變數其實就是一塊記憶體空間的名稱。簡要地說,計算機擁有可供程式使用的隨機存取儲存器(RAM),當一個變數被定義時,一部分記憶體就會被預留給這個變數。 記憶體的最小單位是二進位制數字(binary digit,bit,位元),0或者1。你可以把bi

C/C++結構體初始

1.結構體的初始化 結構體是常用的自定義構造型別,是一種很常見的資料打包方法。結構體物件的初始化有多種方式,分為指定初始化、順序初始化、建構函式初始化。假如有如下結構體。 struct A { int b; int c; } (1)指定初始

結構體的初始

結構體的初始化 typedef struct sTest { int a; int b; }STEST; STEST s1 = {0};

Go-struct巢狀初始

struct巢狀的幾種用法。 示例一 package main import "fmt" import "encoding/json" type Point struct { X, Y int } type Circle struct {

Java____變數的初始相關

Java的賦值和初始化包括很多容易被忽視的地方,在此分類總結如下: 1.和賦值相關: 基本型別的賦值運算需要注意的是賦值時的型別轉換問題,什麼時候可以自動轉換,什麼時候需要強制型別轉換是需要弄清楚的。 首先記住兩個約定:   (1)所有的字面整數都是int型的。

初始 宣告定義

左值既能在賦值的左邊,又能在右邊。 右值只能在右邊。  (++a  是左值  a++是右值); a+1:取變數a的記憶體中的值,然後相加 b = a;把a記憶體中的值拷貝到b的記憶體中 初始化:建立變數並給它賦初始值。 賦值:擦出物件的當前值並用新值替代。 int a(

static變數的初始的區別

事實勝於雄辯,啥也別說,code說明問題: int add(int a, int b) { static int result = a + b; return result; } int _tmain(int argc

POJ 2019 Cornfields 二維線段樹的初始查詢

popu def comm init 都沒有 data- ont emp class 模板到不行。。連更新都沒有。。。存個模板。 理解留到小結的時候再寫。 #include <algorithm> #include <iostream>

C語言結構體數組內帶字符數組初始

指定 char 字符數 全局 種類 def 變量 指針 變量定義 1.首先定義結構體數組: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char cmdP

Java 中 HashMap 初始

lec SM 解決 道理 test ack 增加 數據結構 解決辦法 1、HashMap 初始化的文藝寫法HashMap 是一種常用的數據結構,一般用來做數據字典或者 Hash 查找的容器。普通青年一般會這麽初始化:HashMap<String, S

Mat 的幾種初始方法

cto 轉換 -m mat tro sha 數據 return main 這幾天用到了由cv::Point3f和std::vector<float>到cv::Mat數據類型的轉換。本質上就是換一下容器。今晚做個小總結。 由Point3f 到 Mat 有兩種方法,

結構體和陣列的初始

{} 這種語法不能用於結構體的賦值,只能用於初始化。例如這樣是錯誤的: struct complex_struct z1; z1 = { 3.0, 4.0 }; 結構體變數之間使用賦值運算子是允許的,用一個結構體變數初始化另一個結構體變數也是允許的; 陣列不

C++小知識(陣列的定義、初始

在C/C++中,可以在陣列定義的時候對其進行初始化:int a1[3] = {1, 2, 3};  int a2[3] = {0};                    //將陣列a2各個元素賦值為0。int a3[] = {1, 2, 3};  char s1[3] = 

宣告、定義、初始

變數的定義形式: 首先是型別說明符,隨後緊跟由一個或者多個變數名組成的類別,其中變數名以逗號隔開,最後以分號結束。 例子:int sum,value,unsold; struct GraphNode{     int label;     vect

c++初始部分

陣列初始化列表中的元素個數小於指定的陣列長度時,不足的元素補以預設值。 對於基本型別int來說,當然就是補int()即0了。再看一下非基本型別的陣列: string a[5] = { "foo" }; 有了上面的規則,就很容易知道其實相當於: string a[5

JAVA實驗二:對陣列進行初始、按形式列印

題目:按照要求使用Java編碼。 (1)以型別int[][]宣告一個叫matrix的二維陣列變數,將矩陣初始化為一個5個元素的陣列。 (2)以下列方式為matrix的內部元素賦值:matrix從零開始迴圈到其長度值;例如索引為i,在每次迭代中,將matrix[i]指向一個新的整數