Java 中提供了八種數據類型:6個數字類型(四個整數型,兩個浮點型)、字符類型、布爾型。java
依次分別是 : byte、int、short、long、float、double、char、boolean。spa
char數據類型應用有如下方式:
code
如:char a='A'; char a=97(不能用short類型,由於最高位表示符號,故表示數值的只有15位);
內存
具體的能夠參考下圖:rem
2.一、自動轉換
一個 int 類型變量和一個 byte 類型變量進行相加,運算的結果是:變量的類型將是 int 類型。編譯器
這就是出現了數據類型的自動類型轉換現象。it
數據類型自動轉換:將取值範圍小的類型自動轉換爲取值範圍大的類型。編譯
一樣道理,當一個 int 類型變量和一個 double 變量運算時, int 類型將會自動提高爲 double 類型進行運算。class
public class DataDemo { public static void main(String[] args) { int a = 1; byte b = 2; // byte c = a + b; // int類型和byte類型運算,結果是int類型 int c = a + b; System.out.println(c); } }
轉換原理圖解:變量
轉換規則:範圍小的類型向範圍大的類型提高:byte、short、char 運算時候直接提高爲 int。
byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double。
2.二、強制類型轉換
將 1.5 賦值到 int 類型變量:產生編譯失敗,沒法賦值。
要修改成:int i = (int)1.5; //可是這樣會致使 1.5 變成 1。
doubled=(int)2.5; // double類型數據強制轉成int類型,直接去掉小數點。
double 類型內存8個字節, int 類型內存4個字節。 1.5 是 double 類型,取值範圍大於 int 。
強制類型轉換:將 取值範圍大的類型強制轉換成取值範圍小的類型 。
比較而言,自動轉換是 Java 自動執行的,而強制轉換須要咱們本身手動執行。
一樣道理,當一個 short 類型與 1 相加,咱們知道會類型提高,可是還想給結果賦值給short類型變量,就須要強制轉換。
public class DataDemo2 { public static void main(String[] args) { /** * int a=1.5; 編譯失敗,沒法賦值 */ int i = (int)1.5; double d=2.5; //int類型和double類型運算,結果是double類型 //int類型會提高爲double類型 double e = d + i; System.out.println(e); } }
public class DataDemo3 { public static void main(String[] args) { short s = 1; /** * s = s + 1 會出現編譯失敗 * * 緣由: * s 和 1 作運算的時候,1 是 int 類型,s 會被提高爲 int 類型 * s+1 後的結果是 int 類型,將結果在賦值會 short 類型時發生錯誤 * short 內存2個字節,int 類型4個字節 * 必須將 int 強制轉成 short 才能完成賦值 */ s= (short) (s+1); System.out.println(s); } }
浮點轉成整數,直接取消小數點,可能形成數據損失精度。int 強制轉成 short 砍掉2個字節,可能形成數據丟失。
2.三、+=符號擴展
public class DataDemo4 { public static void main(String[] args) { short s = 1; s += 1; System.out.println(s); } }
分析:s += 1 邏輯上看做是 s = s + 1 計算結果被提高爲int類型,再向short類型賦值時發生錯誤,由於不能將 取值範圍大的類型賦值到取值範圍小的類型。可是, s=s+1進行兩次運算 , += 是一個運算符,只運算 一次,並帶有強制轉換的特色,也就是說 s += 1 就是 s = (short)(s + 1) ,所以程序沒有問題編譯經過, 運行結果是2.
public class DataDemo5 { public static void main(String[] args) { byte b1=1; byte b2=2; byte b3=1+2; //byte b4 = b1 + b2; 編譯失敗 System.out.println(b3); } }
分析:b3 = 1 + 2 , 1 和 2 是常量,爲固定不變的數據,在編譯的時候(編譯器javac),已經肯定了 1+2 的 結果並無超過byte類型的取值範圍,能夠賦值給變量 b3 ,所以 b3=1 + 2 是正確的。
反之, b4 = b2 + b3 , b2 和 b3 是變量,變量的值是可能變化的,在編譯的時候,編譯器javac不肯定 b2+b3的結果是什麼,所以會將結果以int類型進行處理,因此int類型不能賦值給byte類型,所以編譯失 敗。