變數是一個語言中最基本的東西,在Java中也不例外。在變數命名方面,Java允許以字母、底線、$開頭,但是通常只以小寫字母開頭,而且很少使用底線、$符號。另外,需要認真看一看Java的關鍵字和保留字,經常見筆試題上問,const是不是Java的關鍵字這類問題,所以還是需要適當注意一下。
接下來就是Java的變數類型,Java的變數類型一共有8種未經處理資料庫型:byte, short, int, long, float, double, boolean, char。
byte類型
8位二進位位表示的有符號整數,這裡需要強調是有符號整數。
byte的表示範圍是-128到127,因為對於正數來說,最大值表示為0111 1111,其中第一位為符號位,0表示正數,後面7個1表示數值,恰好表示127 。而對於負數而言,為什麼最小值是-128呢?
因為電腦中用補碼來表示負數,求一個負數的補碼的方法:首先寫出負數的原碼,如-127可以表示為1111 1111,其中第一個位的1代表符號位,首先將除符號位外的各位取反得到000 0000,然後在這個數上加1,即得到000 0001,然後再加上符號位就得到這個數的補碼:1000 0001。
用同樣方法可以求出-126的補碼為1000 0010,-1的補碼為1111 1111,由此我們可以看出,對於負數,後七位越小則表示的負數越大,所以最大負數應該為1000 0000,那麼它到底表示是多少呢?我們把除符號位的7位按位取反再加1得到該數的原碼:000 0000取反111 1111,再加1得1000
0000,這個數正好是128,所以最小值為-128 。
short類型
用16位二進位有符號整數表示,推導short表示範圍與byte相似,這裡就不在介紹了。
int類型
用32位二進位有符號整數表示,它是整數的預設表示方法,但是這裡需要強調一下類型自動升級及強制降級所發生的事情。
如:
byte num1 = -126;int num2 = num1;
這時num1就會出現類型自動升級的情況,如下所示:
-126的補碼為1000 0010
而類型升級時規則為符號位自動向高位擴充,即:1111 1111 1111 1111 1111 1111 1000 0010,通過求這個數的原碼為*000 0000 0000 0000 0000 0000 0111 1110,其值正好為126,再加上符號,即表示為-126,這是沒有問題的。
但是如果是強制降級的話就有可能出現問題,如下所示:
int num1 = -132;byte num2 = (byte)num1;
這時-132的int型表示為:000 0000 0000 0000 0000 0000 1000 0100
按位取反加1得補碼:111 1111 1111 1111 1111 1111 0111 1100 <= ( 0111 1011+1)
再前邊加上符號位:1111 1111 1111 1111 1111 1111 0111 1100
將其強制轉換為byte時,值變為:0111 1100
上邊的值為變成了正的124,不但值變了,而且還改變了符號。
綜上所述,這種強制的類型轉換是非常危險的,需要十分謹慎才行。
long類型
8位元組表示的整數。
float類型
32位表示的單精確度數。由於小數預設都是double型的,因此需要在小數後面加上尾碼f表示其為float型。
double類型
64位表示的雙精確度數。
對於double型(包括float型),需要特別注意其表示小數時是不精確的,因此如果進行精確的運算時,需要格外注意。不光如此,即使進行普通的計算,也要注意這個問題。比如下面的程式:
double num1 = 0.1;double num2 = 0.2;System.out.println("num1+num2=" + (num1+num2) + "!");
運行這個程式,其輸出結果為:num1+num2=0.30000000000000004,而不是我們理所當然認為的0.3。如果此時我們用if (0.3 == num1+num2)來判斷的話,那麼結果將永遠為假,與我們希望的結果非常不一致。
boolean類型
僅有兩個值true或false,但是儲存空間是不定的。
char類型
16位Unicode字元,\u0000到\uffff,表示65536個字元。