原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/08/2809371.html
英文出自 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
java程式設計語言是靜態類型,這表示變數使用前必須聲明。這涉及闡明該變數的類型和名稱,如你已經看到了:
int gear = 1;
上面告訴你的程式,存在一個欄位名為”gear”,儲存數位資料,初始值為“1”。變數的資料類型,決定它可以包含的值,還有它可以做的操作。對於int更多的是,java程式設計語言支援其他原生資料類型。原生類型是程式設計語言預定義的,而且類型名字也是保留字。原生類型的值,不會和其他原生類型的值共用狀態。java程式設計語言支援八種原生類型:
byte:byte的資料類型是一個8位有符號的二進位補碼整數。最小值是128,最大值是127(包括)。當節省記憶體很重要,byte資料類型在大數組中節省記憶體很有用。如果變數的值的限制有利于澄清代碼,也可以用byte替代int;事實上,變數的範圍限制,可以作為文檔形式。
short:short資料類型是16位的有符號的補碼整數。最小值是-32,768 ,最大值是32,767 (包括)。和byte相比,也有一樣準則:當節省記憶體很重要,short資料類型在大數組中節省記憶體很有用。
int:int資料類型是32位的有符號的補碼整數。最小值是-2,147,483,648 ,最大值是2,147,483,647 (包括)。對於完整的值,這個資料類型通常是預設選擇,除非有其他原因(例如上述原因)。這個資料類型大多數情況下,足夠你的程式使用整數。如果你需要一個更大範圍的值,可以使用long。
long:long資料類型是64位的有符號的補碼整數。最小值是-9,223,372,036,854,775,808 ,最大值是9,223,372,036,854,775,807 (包括)。當需要的值範圍超過了int,就可以使用這個資料類型。
float:float 資料類型是單精確度 32 位 IEEE 754 浮點數。它的值的範圍超出了本討論,但是可以參考java語言規範的浮點類型。和byte,short的建議一樣,當你使用大量浮點數數組,需要節省記憶體,使用float。此資料類型永遠不應該用於精確的值,如貨幣。為此,您將需要使用 java.math.BigDecimal 類來代替。Java 平台提供數字和字串包括 BigDecimal 和的其他有用的類。
double:double資料類型是單精確度 64 位元 IEEE 754 浮點數。它的值的範圍超出了本討論,但是可以參考java語言規範的浮點類型。對於小數值,這個資料類型是預設選擇。如上面的建議,此資料類型永遠不應該用於精確的值。
boolean:boolean資料類型只有兩個可能值:true和false.使用此資料作為簡單標記來跟蹤真/假條件。這種資料類型代表一個位元的資訊,但它的“大小”沒有明確界定。
char:char資料類型是單個16 位Unicode 字元。它的最小值是'\u0000' (或0),最大值是'\uffff'(或65,535 包括).
除了上面列出的8個原生資料類型,java程式設計語言通過類java.lang.String提供字串的特殊支援。使用兩個雙引號包圍字串,會自動建立String對象;例如,String s = "this is a string";String對象是不可變的,這表示它一旦被建立,它的值就不可變。類String從技術上講,它不是一個原生類型,但是可以認為,它是java語言特殊支援的,你可能會傾向於認為它是原生類型。
預設值
當欄位聲明,未必一定要賦值。欄位聲明了,但是沒有初始化,編譯器將會設定一個合理的預設值。一般來說,預設值是0或者null,取決於資料類型。但是,依靠這種預設值,一般認為是糟糕的編程風格。
下面的表徵圖總結上面涉及的資料類型的預設值。
Data Type |
Default Value (for fields) |
byte |
0 |
short |
0 |
int |
0 |
long |
0L |
float |
0.0f |
double |
0.0d |
char |
'\u0000' |
String (or any object) |
null |
boolean |
false |
局部變數略有不同,編譯器不會給一個沒有初始化的局部變數賦預設值。如果你沒有在局部變數聲明時,初始設定變數,那麼,你必須在使用它之前給它賦值。訪問一個沒有初始化的局部變數,編譯器會報錯。
常量
你可能注意到初始化原生類型的變數,不用使用new關鍵字。原生類型是java語言內建的特殊資料類型,不是類建立的對象。常量是原始碼裡表示的固定值。常量直接表示代碼中不要求計算。如下顯示,原生類型的變數可以賦值常量:
boolean result = true;char capitalC = 'C';byte b = 100;short s = 10000;int i = 100000;Integer Literals
整數常量
如果整數常量結尾是字母L或者l,那麼它是long類型,否則它就是int類型。推薦使用大寫字母L,因為小寫字母l和數字1很難區分。
從int常量,可以建立整數byte,short,int,long。long常量,可以建立超出int的範圍的long類型的值。整數常量可以由下面數字系統表達:
十進位:10進位,包含從0到9的數字,這個是你每日都用的數字系統。
十六進位:16進位,包含0到9,字母A到F。
二進位:2進位,包含0到1的數字(Java SE 7和後續版本可以建立二進位常量)。
常規編程,十進位系統是使用的唯一的數字系統。但是,如果你在其它數字系統需要使用,下面的例子,示範正確文法。首碼0x指示十六進位,0b指示二進位:
// The number 26, in decimalint decVal = 26;// The number 26, in hexadecimalint hexVal = 0x1a;// The number 26, in binaryint binVal = 0b11010;
浮點常量
以字母F或者是f結尾的浮點常量是float類型,否則其它就是double類型,這裡有個可選的選項是以字母D或者d結尾。
浮點型 (浮點和雙精確度) 也可以表示使用 E 或 e (科學記號標記法)、 F 或 f (32 位浮點常量) 和 D 或 d (64 位元雙精確度浮點常量;這是預設設定,按照慣例可以省略)。
double d1 = 123.4;// same value as d1, but in scientific notationdouble d2 = 1.234e2;float f1 = 123.4f;
字元和字串常量
char和String常量包含任意Unicode (UTF-16)字元。如果編輯器和檔案系統允許,就可以直接在代碼裡使用字串。如果不允許,使用"Unicode 轉義",例如'\u0108' ,char常量使用’單引號’,String常量使用”雙引號”。Unicode 逸出序列可以用於程式的其他地方(例如欄位名),而不是char或String常量。
java程式設計語言對於char和String常量也支援其他轉義:\b (退格鍵), \t (選項卡), \n (分行符號), \f (換頁符), \r (斷行符號), \" (雙引號), \' (單引號), \\ (反斜線).
null常量,用於任何參考型別的值。null可以複製給任何變數,處理原生類型。使用null值,可以判斷對象是否存在。所以,null常常用來在程式中標記,指示一些對象不可用。
最後,有一種特別的常量,成為類常量。格式是類型名字加上”.class”;例如,String.class。這表示,引用對象(或者類)表示的類型本身。
數值常量使用底線
Java SE 7以及後續版本,數字常量可以在數字中出現任意的底線(_)。這個特性,可以在數字常量中給數字分組,提供代碼的可讀性。
對於執行個體,如果代碼中的數值包含很多數字,您可以使用底線來分隔數字組為三個,類似於使用標點符號,如逗號,空格,作為分隔字元。
下面的例子,示範在數值常量使用底線:
long creditCardNumber = 1234_5678_9012_3456L;long socialSecurityNumber = 999_99_9999L;float pi = 3.14_15F;long hexBytes = 0xFF_EC_DE_5E;long hexWords = 0xCAFE_BABE;long maxLong = 0x7fff_ffff_ffff_ffffL;byte nybbles = 0b0010_0101;long bytes = 0b11010010_01101001_10010100_10010010;
只能將底線放在數字之間,不能將底線放在以下位置:
數值的開頭或結尾
毗鄰浮點常量中的小數點
F或者L尾碼的前面
在數值期望為字串的位置
下面的例子證明了數值常量中合法和非法的底線位置:
// Invalid: cannot put underscores// adjacent to a decimal pointfloat pi1 = 3_.1415F;// Invalid: cannot put underscores// adjacent to a decimal pointfloat pi2 = 3._1415F;// Invalid: cannot put underscores// prior to an L suffixlong socialSecurityNumber1 = 999_99_9999_L;// This is an identifier, not// a numeric literalint x1 = _52;// OK (decimal literal)int x2 = 5_2;// Invalid: cannot put underscores// At the end of a literalint x3 = 52_;// OK (decimal literal)int x4 = 5_______2;// Invalid: cannot put underscores// in the 0x radix prefixint x5 = 0_x52;// Invalid: cannot put underscores// at the beginning of a numberint x6 = 0x_52;// OK (hexadecimal literal)int x7 = 0x5_2;// Invalid: cannot put underscores// at the end of a numberint x8 = 0x52_;