1.Java的8種基本數據類型及其所占空間大小:
boolean 8bit/1byte
byte 8bit/1byte
char 16bit/2byte
short 16bit/2byte
float 32bit/4byte
int 32bit/4byte
long 64bit/8byte
double 64bit/8byte
2.Java自動類型轉換
1)兩種類型是彼此兼容的
2)轉換的
目的類型占得空間范圍一定要大於轉化的
源類型
正向過程:由低字節向高字節自動轉換
byte->short->int->long->float->double
逆向過程:使用強制轉換,可能丟失精度。
int a=(int)3.14;
3. Java數據類型自動提升(注意以下討論的是二元操作符)
Java定義了若干使用於表達式的類型提升規則:
1)
所有的byte型. short型和char型將被提升到int型(例外: final修飾的short, char變量相加后不會被自動提升。)
2)如果一個操作數是long形 計算結果就是long型;
3)如果一個操作數是float型,計算結果就是float型;
4)如果一個操作數是double型,計算結果就是double型;
另一種歸納方式(《Java核心技術卷I》P43):
如果兩個操作數其中有一個是double類型,另一個操作就會轉換為double類型。
否則,如果其中一個操作數是float類型,另一個將會轉換為float類型。
否則,如果其中一個操作數是long類型,另一個會轉換為long類型。
否則,兩個操作數都轉換為int類型。
eg 1:
1 Promote.java class promote 2 { 3 public static void main (string args[]) 4 { 5 byte b = 50; 6 char c = 'a'; 7 short s = 1024; 8 int i = 50000; 9 float f =5.67f; 10 double d =0.1234; 11 double result = (f * b) + (i / c) - (d * s); 12 } 13 }
講解:
第一個表達式f * b中,b被提升為float類型,該子表達式的結果也提升為float類型。
第二個表達式i / c中,變量c被提升為int類型,該子表達式的結果提升為int類型。
第三個表達式d * s中,變量s被提升為double類型,該子表達式的結果提升為double型。
最后,這三個結果類型分別是float,int和double類型,想減后該表達式的最后的結果就是double類型。
5) 黙認浮點類型為double,float數據類型有一個后綴為" f "或" F "。
6) long類型有一個后綴,為" l " 或者" L "。
eg 2:
1 byte a = 1; 2 3 byte b = 2; 4 5 a = a+b; //編譯出錯自動類型提升成int 6 7 a += b; //自加沒有自動類型提升問題
把高字節轉成低字節,需要作強制類型轉換. byte c=(byte)a+b;
eg 3:
1 byte b1=1,b2=2,b3,b6; 2 final byte b4=4,b5=6; 3 b6=b4+b5; 4 b3=(b1+b2); //會發生編譯錯誤 5 System.out.println(b3+b6);
沒有final修飾的變量相加后會被自動提升為int型,與目標類型byte不相容,需要強制轉換(向下轉型)。
4. Java強制類型轉換
格式:目標類型 變量=(目標類型)源類型變量/常量
eg:
int i=5;
byte j=(int)i;
注意:在強制類型轉換中目標類型和源類型變量的類型始終沒有發生改變
易錯點:
byte b;
b=3;
b=(byte)b*3
//編譯出錯,因為(byte)的運算級別比*高,所以會先轉換b后再*3
b=(byte)(b*3)
//正確
參考博文:
http://blog.csdn.net/liang5630/article/details/37935383
http://blog.sina.com.cn/s/blog_66e7f79b0100ysd3.html