1. 程式人生 > >Java____變數的初始化與賦值相關

Java____變數的初始化與賦值相關

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”。(這個之前看到有人說 是因為執行str+"xxx"是新建一個物件 把引用賦值給str)

   (6)初始化塊:      初始化塊分為兩種:靜態初始化塊和例項初始化塊;

      靜態初始化塊用來初始化類中的static屬性成員,例項初始化塊用來初始化例項屬性成員。

     第一次載入類時,會執行靜態初始化塊,沒建立一個新的例項,就會執行一次例項初始化塊。例項初始化塊的執行是在所有的超類建構函式執行之後。靜態初始化塊是在所有超類建構函式之前執行。多個初始化塊並存時,執行的順序即他們在類檔案中出現的順序。