這幾天對Java數據類型做了一下總結,參考了一些資料,具體內容如下,如有錯誤請指正。博文下方有此文PDF版下載鏈接。
Java數據類型精解
1 Java數據類型
Java變量包括如下兩大類數據類型:
l 基本數據類型:
Ø 整數:byte、short、int、long
Ø 浮點數:float、double
Ø 字符類型:char
Ø 布爾類型:boolean
l 對象數據類型:
Ø Java類的實例對象類型。
1.1 基本數據類型
基本數據類型,是比較簡單地表達一些基本的數據類型,包括一下幾類:
l byte(字節型):計算機中1字節一般來說佔8位。
l char(字符型):佔2字節,也就是16位。
l short(短整型):佔2字節,也就是16位。
l int(整型):佔4字節,也就是32位。
l long(長整型):佔8字節,也就是64位。
l float(單精度實型):小數點後保留7位有效數字,佔32位。
l double(雙精度實型):小數點後保留15位有效數字,佔64位。
l boolean(字節型):佔1字節,8位。
我們知道所有的數據都是以0和1的組合來存儲的,例如整型數字1,在計算機中的實際存儲形勢爲:
00000000 00000000 00000000 00000001
上面的每一個0或者每一個1都被稱爲1個位。
表一 基本數據類型
類型 |
字節數 |
位數 |
取值範圍 |
舉例 |
byte |
1 |
8 |
-27~27-1的整數 |
-128,54,127 |
short |
2 |
16 |
-215~215-1的整數 |
1348,6543 |
int |
4 |
32 |
-231~231-1的整數 |
0,-1000,345678 |
long |
8 |
64 |
-263~263-1的整數 |
987657897,-12 |
float |
4 |
32 |
-231~231的整數 |
23.978,87F |
double |
8 |
64 |
-263~263的整數 |
2.0231,0.435D |
char |
2 |
16 |
-215~215的整數 |
400,A,z,x,-23 |
boolean |
1 |
8 |
true,false |
true |
(1)float類型
數值有一個後綴——F,如果沒有後綴F,那麼默認爲double。Double類型的數值也可以使用後綴D。當這些數字遇到取值範圍錯誤時,會發生上溢(Overflow);而在遇到被零整除時,會發生下溢(Underflow)。
(2)字符類型:char
雙引號則表示一個字串,它是Java的一個對象類型String,並不是數據類型。在Java中除了用這個\u的形式來表示字符外,還可以用換碼序列來表示特殊字符。
\b 退格 \u0008
\t Tab 製表 \u0009
\n 換行 \u000a
\r 硬回車 \u000d
\"雙引號 \u0022
\'單引號 \u0027
\ 反斜槓 \u005c
與變量定義一起使用,例子如下:
byte myByte=49;
byte myByte2=128; //錯誤,取值範圍過大
short myShort=2345;
int myInt=123;
int myInt2=012; //012是用八進制表示的數字,以0開頭的數字代表八進制數字。
int myInt3=0x12E5F; //0x12E5F是用十六進制表示的數字,以0x開頭的數字代表八進制數字。
long myLong=23;
long myLong2=245L; //以L結尾表示該數值爲長整型
float myFloat=456.56F; //以F結尾表示該數字爲單精度實型
double myDouble=23.56789D; //以D結尾表示該數字爲雙精度實型
如果你對八進制和十六進制的轉換不太清楚的話,首先要知道十進制、八進制和十六進制的成員。
l 十進制的基本成員:0、1、2、3、4、5、6、7、8、9
l 八進制的基本成員:0、1、2、3、4、5、6、7
l 十六進制的基本成員:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F(其中A、B、C、D、E、F分別代表10、11、12、13、14、15)。
(1)八進制轉十進制
例如,八進制數345轉換成十進制數爲:5*80+4*81+3*82
(2)十六進制轉十進制
例如,十六進制數45轉換成十進制數爲:5*160+4*81
1.2 對象數據類型
Java是面向對象的程序設計語言,因此Java的數據類型中包括了對象數據類型。例如String對象、Date對象和數組對象等。
如下列所示:
String shenkxiao="Shenkxiao"; //字符串對象
Date time=new Date(); //日期對象
Hello Shenkxiao inst=new Hello Shenkxiao();//Hello Shenkxiao實例對象
表二 基本數據類型與對象數據類型對應關係
基本數據類型 |
byte |
short |
int |
long |
float |
double |
char |
boolean |
對象數據類型 |
Byte |
Short |
Integer |
Long |
Float |
Double |
Character |
Boolean |
因此,如下定義的兩個變量a和b,雖然他們代表的值都是1,卻是不同的類型,一個是簡單數據類型,另一個是對象數據類型。
int a=1;
Integer b=new Integer(1);
此外,Java中還有很多其他對象類型。
1.3 引用數據類型
Java中所有對象都要通過對象引用訪問,對象引用是指向對象存儲所在堆中某個區域的指針,所有的對象數據類型都屬於引用數據類型。例如下列所示,b和c都是引用類型:
int a=1; //基本數據類型
Integer b=new Integer(1); //對象引用
Integer c=b; //對象引用
引用類型和基本數據類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型哦數據結構存儲,當引用類型和基本數據類型用做某個類得實例數據時所指定的默認值。對象引用實例變量的默認值爲null,而基本數據類型實例變量的默認值與他們的類型有關。
許多程序的代碼將同時包含基本數據類型及他們的對象封裝。當檢查它們是否相等時,同時使用這兩種類型並瞭解它們如何正確相互作用和共存將成爲問題。程序員必須瞭解這兩種類型是如何工作和相互作用的,以避免代碼出錯。
例如,不能對原始類型調用方法,但可以對對象調用方法:
int a=1; //基本數據類型
a.hashCode(); //錯誤
Integer b=new Integer(1); //對象引用
b.hashCode(); //正確
使用基本數據類型無須調用new,也無需創建對象,這節省了時間和空間。混合使用基本數據類型和對象也可能導致與賦值有關的意外結果。看起來沒有錯誤的代碼可能無法完成你希望做的工作,例如:
int a=1; //基本數據類型
int b=2;
Point x=new Point(0,0);
Point y=new Point(1,1);
System.out.println("a is "+a);
System.out.println("b is "+b);
System.out.println("x is "+x);
System.out.println("y is "+y);
System.out.println("改變位置……");
a=b; //改變基本數據類型的值
a++; //改變基本數據類型的值
x=y; //引用類型
x.setLocation(5, 5); //修改對象的值
System.out.println("a is "+a);
System.out.println("b is "+b);
System.out.println("x is "+x);
System.out.println("y is "+y);
這段代碼輸出以下結果:
a is 1
b is 2
x is java.awt.Point[x=0,y=0]
y is java.awt.Point[x=1,y=1]
改變位置……
a is 3
b is 2
x is java.awt.Point[x=5,y=5]
y is java.awt.Point[x=5,y=5]
修改整數a和b的結果沒什麼意外的地方。b的值被賦予變量a,結果a的值增加了1。這一輸出反映了我們希望發生的情況。但是,令人感到意外的是在賦值並調用setLocation之後x和y對象的輸出。我們在完成x=y賦值之後特意對x調用了setLocation,x和y的值怎麼會相同呢?我們畢竟將y賦予x,然後更改了x,這與我們對整數a和b進行的操作沒什麼不同。
這種混淆是由基本數據類型和對象的使用造成的。賦值對這兩種類型所起的作用沒什麼不同,但它可能看起來有所不同,賦值使(=)左邊的值等於右邊的值。這一點對於基本數據類型(如前面的int a和b)是顯而易見的。對於非基本數據類型(如Point 對象),賦值修改的是對象引用,而不是對象本身。因此,x和y引用同一個對象,所以對x執行的所有方和和對y執行的所有方法都作用於同一個對象。
1.4 數組數據類型
Java數組(array)是動態創建的索引對象,這一點和類非常相似,此外,同類一樣,數組只能索引數組的實例或者null,如以下代碼所示:
int[] myIntArray=new int[5]; //定義一個長度爲5的數組,數組默認初始值是0
int myIntArray[]=new int[5]; //C 風格的聲明方式也是可以的。 此處感謝mougaidong的建議
int[] anotherIntArray=null;
數組是Object類的繼承,這樣,Object類的所有方法都可以被數組調用,數組對象由元素組成,元素的數目也可以爲0,在這種情況下稱作數組爲空。所有的數組都是從0開始對元素編號的,這意味着數組內的第一個元素的索引編號是數字0。所有對數組元素的訪問都會在運行時接受檢查,如果試圖使用編號小於0或者大於數組長度的值來索引元素就會產生