自動類型轉換也叫隱式類型轉換
表達式的資料型別會自動提升
所有的byte型、short型別和char的值將會被提升到int型。
如果一個運算元是long型,計算結果就是long型;
如果一個運算元是float型,計算結果就是float型;
如果一個運算元是double型,計算結果就是double型。
int值可以賦值給long、float、double型變量,不能賦值給byte、short、char型變數
#對於函數的傳參也是一樣
#當然,在有函數重載的情況下,java編譯器會自動選擇最匹配的函數進行呼叫
所有長度都低於int的型別(byte、short、char)在運算之後結果將會被提升為int型
當然還有以下的這種情況,這種情況是因為我們在進行賦值運算的時候,java編譯器可以明確知道運算的結果是否超過byte或short的取值範圍,所以byte a = 1 1; 並沒有報錯。而上面 byte c = a b; 編譯出錯的原因是因為a和b都是一個變量,相加的結果是否會超過byte的取值範圍編譯器並不知道,所以編譯器將結果提升為int型了。
小結一下:
#當編譯器明確知道整數的運算結果沒有到達int的表示範圍時,byte、short或char類型的運算結果不會被自動提升為int型別
當編譯器明確知道或不清楚整數的運算結果是否到達int的表示範圍時,編譯器將會自動將運算的結果轉換成int,即使原來是byte、short或char型別。
答案: 賦值| 運算時,兩邊資料型別不一致時就會發生類型轉換
如下:
public class TypeTest { public static void main(String[] args){ // 运算时发生的隐式类型转换,两整数相除得到的还是一个整数 byte a = 3; byte b = 4; int num = a + b; System.out.println(num); // 7 // 赋值时发生的隐式类型转换 int ch = '0'; System.out.println(ch); // 48 // 运算时发生的强制类型转换 byte a1 = 12; byte a2 = 12; byte num1 = (byte)(a1 + a2); System.out.println(num1); // 24 // 赋值时发生的强制类型转换 short b3 = 1234; byte a3 = (byte) b3; System.out.println(a3); // -46 } }
運行截圖:
自動型別轉換
強制型別轉換
#規則:從小到大,低位元組自動提升到高位元組
##byte(1位元組) – > short( 2位元組)-- > int(4位元組) – > long(8位元組) --> float(4位元組) – > double(8位元組)#> float(4位元組) – > double(8位元組)
char (2位元組)-- > int(4位元組) – > long(8位元組) --> float(4位元組) – > double(8位元組)
畫圖分析:
程式碼展示:
public class TypeDemo { public static void main(String[] agrs){ // byte -- > short byte b1 = 127; short s1 = b1; System.out.println(s1); // 127 // short -- > int short s2 = 30000; int i = s2; System.out.println(i); // 30000 // int -- > long int num = 2100000000; long lg = num; System.out.println(num); // 2100000000 // long -- > float long lg1 = 200000000000000L; float f1 = lg1; System.out.println(f1);// 2.00000001E14 // float -- > double float f2 = 3.14f; double d1 = f2; System.out.println(d1); // 3.140000104904175 // char -- > int char ch = 'a'; int i1 = ch ; System.out.println(i1); // 97 // char -- > long char ch2 = 'b'; long lg2 = ch2; System.out.println(lg2); // 98 // char -- > double char ch3 = 'c'; double dou = ch3; System.out.println(dou); // 99.0 // char -- > float char ch4 = 'd'; float f3 = ch4; System.out.println(f3); // 100.0 } }
執行截圖:
注意:
byte、short不能和char進行相互轉換
程式碼展示:
public class TypeDemo2 { public static void main(String[] agrs){ // byte -- > char byte bt = 127; char ch = bt; System.out.println(ch); // short -- > char short sh = 12; char ch2 = sh; System.out.println(ch2); } }
編譯錯誤截圖:
float雖然是4個位元組,但是float比long表示的資料範圍更大。說明資料範圍的大小和位元組的大小不一定相關
程式碼展示:
public class TypeDemo3 { public static void main(String[] agrs){ long lg = 20000000000000L; float f1 = lg; System.out.println(f1); // 1.99999997E13 } }
運行截圖:
boolean類型不能參與型別轉換
程式碼展示:
public class TypeDemo4 { public static void main(String[] agrs) { boolean flag = 12; int flag1 = flag; System.out.println(flag1); } }
編譯錯誤截圖:
規則:從大到小,高位元組手動強制轉換到低位元組
#########
double(8字节) – > float(4字节) – > long(8字节) – > int(4字节) – > short (2字节)-- > byte(1字节)
double(8字节) – > float(4字节) – > long(8字节) – > int(4字节) – > char(2字节)
画图分析:
(掌握)格式:目标数据类型 变量名 = (目标数据类型) 变量 | 常量;
代码展示:
public class TypeDemo5 { public static void main(String[] agrs){ // float -- > long // final float PI = 3.14f; // long num = (long) PI; // 3 // float little = 3.14f; // long num = (long)little; // 3 long num = (long)3.14f; System.out.println(num);// 3 // double -- > float // double dou = 3.14; // float little1 = (float)dou; // 3.14 // float little1 = (float) 3.14d; // 3.14 final double dou = 3.14; float little1 = (float)dou; System.out.println(little1); // 3.14 // long -- > int // long num1 = 2000000000000L; // int num2 = (int)num1; // -1454759936 // int num2 = (int)2000000000000L; // -1454759936 final long num1 = 2000000000000L; int num2 = (int)num1; System.out.println(num2); // -1454759936 // int --> short // int num3 = 12; // short num4 = (short)num3; // 12 // short num4 = (short)40000; // -25536 final int num3 = 60; short num4 = (short)num3; System.out.println(num4); // 60 // short -- > byte final short sh = 12345; byte bt = (byte)sh; System.out.println(bt); // 57 short sh2 = 78; bt = (byte) sh2; System.out.println(bt); // 78 } }
运行截图:
注意:
强制类型转换有数据丢失,一般不建议使用
代码展示:
public class TypeDemo6 { public static void main(String[] agrs) { short a = 1245; byte b = (byte)a; System.out.println(b); } }
运行截图:
以上是Java中類型自動轉換機制的範例與分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!