Java的賦值和初始化包括很多容易被忽視的地方,在此分類總結如下:
1.和賦值相關:
基本類型的賦值運算需要注意的是賦值時的類型轉換問題,什麼時候可以自動轉換,什麼時候需要強制類型轉換是需要弄清楚的。
首先記住兩個約定:
(1)所有的字面整數都是int型的。
(2)所有的字面浮點數都是double型的,因此聲明一個float 型的浮點數,必須做類型轉換,或者聲明時加上f。float ads=3.13f。
第一條:一個佔用int或更短長度的運算式的結果總是一個int,也就是兩個byte型的結果加到一起,結果是int。舉個例子,下面的代碼是會出編譯錯誤的:
byte b=3;
byte c=8;
byte d=b+c;
b+c的結果是一個int型的值,而d是一個byte型的值,轉換時向著範圍比較小進行轉換,編譯器是會報錯的,如果顯示的強制類型轉換,則不會出問題。
從小範圍到大範圍的轉換是不需要顯示強制轉換的,包括從long型向float和double型的。
當編譯器知道過大而無法被變數儲存的字面值賦給變數,將會得到編譯錯誤。
byte a=128;
注意有幾個運算子在類型轉換的特殊地方。
+=,-=,*=,/=這幾個運算子都將使用隱式的強制類型轉換。
byte b=3;
b+=7;//這時是正確的。
2和初始化有關:
(1)對於執行個體變數,都會初始化成預設值。對於對象參考型別的執行個體變數,其初始值是null。
(2)數組對象比較特殊,數組是一個對象,數組元素總是被賦予預設值,不論數組實在哪裡聲明和執行個體化,即使該數組是局部變數都是如此。如果數組元素是對象的引用,則預設值為null,如果數組元素是基本類型,則預設值是基本類型的預設值。
(3)局部變數是沒有預設值的,不論是基本類型,還是對象的引用,因此,任何局部變數在使用之前都必須顯式的作初始化,否則會出現編譯錯誤。
(4)對象的引用相互賦值,並不修改對象本身(String對象除外)。
(5)對於String對象,要記住這樣幾點,String對象的值是不可以改變的,因此,下面的例子看起來似乎很矛盾:
String str="zhanglei";
String str2=str;
str=str+" ,how are you?";
語句的詳細解釋如下:
首先在堆中建立一個String對象“zhanglei”,然後讓對象引用str指向這個對象,第二條語句將對象引用str賦給str2對象引用。第三條語句將對象“zhanglei”和對象“how are you ?”做串連操作,產生一個新的對象,然後把這個對象的引用賦給str。因此,此時如果列印str2的內容還是“zhanglei”。
(6)初始化塊:
初始化塊分為兩種:靜態初始化塊和執行個體初始化塊;
靜態初始化塊用來初始化類中的static屬性成員,執行個體初始化塊用來初始化執行個體屬性成員。
第一次載入類時,會運行靜態初始化塊,沒建立一個新的執行個體,就會運行一次執行個體初始化塊。執行個體初始化塊的運行是在所有的超類建構函式運行之後。靜態初始化塊是在所有超類建構函式之前運行。多個初始化塊並存時,啟動並執行順序即他們在類檔案中出現的順序。