原文出自 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 decimal int decVal = 26; // The number 26, in hexadecimal int hexVal = 0x1a; // The number 26, in binary int 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 notation double 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 point float pi1 = 3_.1415F; // Invalid: cannot put underscores // adjacent to a decimal point float pi2 = 3._1415F; // Invalid: cannot put underscores // prior to an L suffix long socialSecurityNumber1 = 999_99_9999_L; // This is an identifier, not // a numeric literal int x1 = _52; // OK (decimal literal) int x2 = 5_2; // Invalid: cannot put underscores // At the end of a literal int x3 = 52_; // OK (decimal literal) int x4 = 5_______2; // Invalid: cannot put underscores // in the 0x radix prefix int x5 = 0_x52; // Invalid: cannot put underscores // at the beginning of a number int x6 = 0x_52; // OK (hexadecimal literal) int x7 = 0x5_2; // Invalid: cannot put underscores // at the end of a number int x8 = 0x52_;