您好,登錄后才能下訂單哦!
這篇文章主要介紹了java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
自動(dòng)類(lèi)型轉(zhuǎn)換也叫隱式類(lèi)型轉(zhuǎn)換
表達(dá)式的數(shù)據(jù)類(lèi)型自動(dòng)提升
所有的byte型、short型和char的值將被提升到int型。
如果一個(gè)操作數(shù)是long型,計(jì)算結(jié)果就是long型;
如果一個(gè)操作數(shù)是float型,計(jì)算結(jié)果就是float型;
如果一個(gè)操作數(shù)是double型,計(jì)算結(jié)果就是double型。
int值可以賦值給long、float、double型變量,不能賦值給byte、short、char型變量
對(duì)于函數(shù)的傳參也是一樣
當(dāng)然,在有函數(shù)重載的情況下,java編譯器會(huì)自動(dòng)選擇最匹配的函數(shù)進(jìn)行調(diào)用
所有長(zhǎng)度低于int的類(lèi)型(byte、short、char)在運(yùn)算之后結(jié)果將會(huì)被提升為int型
當(dāng)然還有以下的這種情況,這種情況是因?yàn)槲覀冊(cè)谶M(jìn)行賦值運(yùn)算的時(shí)候,java編譯器可以明確知道運(yùn)算的結(jié)果是否超過(guò)byte或short的取值范圍,所以 byte a = 1 + 1; 并沒(méi)有報(bào)錯(cuò)。而上面 byte c = a + b; 編譯出錯(cuò)的原因是因?yàn)閍和b均為一個(gè)變量,相加的結(jié)果是否會(huì)超過(guò)byte的取值范圍編譯器并不知道,所以編譯器將結(jié)果提升為int型了。
小結(jié)一下:
當(dāng)編譯器明確知道整數(shù)的運(yùn)算結(jié)果沒(méi)有到達(dá)int的表示范圍時(shí),byte、short或char類(lèi)型的運(yùn)算結(jié)果不會(huì)被自動(dòng)提升為int類(lèi)型
當(dāng)編譯器明確知道或不清楚整數(shù)的運(yùn)算結(jié)果是否到達(dá)int的表示范圍時(shí),編譯器將會(huì)自動(dòng)將運(yùn)算的結(jié)果轉(zhuǎn)換成int,即使原來(lái)是byte、short或char類(lèi)型。
答: 賦值 | 運(yùn)算時(shí) ,兩邊數(shù)據(jù)類(lèi)型不一致時(shí)就會(huì)發(fā)生類(lèi)型轉(zhuǎn)換
如下:
public class TypeTest { public static void main(String[] args){ // 運(yùn)算時(shí)發(fā)生的隱式類(lèi)型轉(zhuǎn)換,兩整數(shù)相除得到的還是一個(gè)整數(shù) byte a = 3; byte b = 4; int num = a + b; System.out.println(num); // 7 // 賦值時(shí)發(fā)生的隱式類(lèi)型轉(zhuǎn)換 int ch = '0'; System.out.println(ch); // 48 // 運(yùn)算時(shí)發(fā)生的強(qiáng)制類(lèi)型轉(zhuǎn)換 byte a1 = 12; byte a2 = 12; byte num1 = (byte)(a1 + a2); System.out.println(num1); // 24 // 賦值時(shí)發(fā)生的強(qiáng)制類(lèi)型轉(zhuǎn)換 short b3 = 1234; byte a3 = (byte) b3; System.out.println(a3); // -46 } }
運(yùn)行截圖:
自動(dòng)類(lèi)型轉(zhuǎn)換
強(qiáng)制類(lèi)型轉(zhuǎn)換
規(guī)則:從小到大 ,低字節(jié)向高字節(jié)自動(dòng)提升
順序:
byte(1字節(jié)) – > short(2字節(jié))-- > int(4字節(jié)) – > long(8字節(jié)) --> float(4字節(jié)) – > double(8字節(jié))
char (2字節(jié))-- > int(4字節(jié)) – > long(8字節(jié)) --> float(4字節(jié)) – > double(8字節(jié))
畫(huà)圖分析:
代碼展示:
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 } }
運(yùn)行截圖:
注意:
byte、short不能和char進(jìn)行相互轉(zhuǎn)換
代碼展示:
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); } }
編譯錯(cuò)誤截圖:
float雖然是4個(gè)字節(jié),但是float比long表示的數(shù)據(jù)范圍更大。說(shuō)明數(shù)據(jù)范圍的大小和字節(jié)的大小不一定相關(guān)
代碼展示:
public class TypeDemo3 { public static void main(String[] agrs){ long lg = 20000000000000L; float f1 = lg; System.out.println(f1); // 1.99999997E13 } }
運(yùn)行截圖:
boolean類(lèi)型不能參與類(lèi)型轉(zhuǎn)換
代碼展示:
public class TypeDemo4 { public static void main(String[] agrs) { boolean flag = 12; int flag1 = flag; System.out.println(flag1); } }
編譯錯(cuò)誤截圖:
規(guī)則:從大到小,高字節(jié)向低字節(jié)手動(dòng)強(qiáng)制轉(zhuǎn)換
順序:
double(8字節(jié)) – > float(4字節(jié)) – > long(8字節(jié)) – > int(4字節(jié)) – > short (2字節(jié))-- > byte(1字節(jié))
double(8字節(jié)) – > float(4字節(jié)) – > long(8字節(jié)) – > int(4字節(jié)) – > char(2字節(jié))
畫(huà)圖分析:
(掌握)格式:目標(biāo)數(shù)據(jù)類(lèi)型 變量名 = (目標(biāo)數(shù)據(jù)類(lèi)型) 變量 | 常量;
代碼展示:
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 } }
運(yùn)行截圖:
注意:
強(qiáng)制類(lèi)型轉(zhuǎn)換有數(shù)據(jù)丟失,一般不建議使用
代碼展示:
public class TypeDemo6 { public static void main(String[] agrs) { short a = 1245; byte b = (byte)a; System.out.println(b); } }
運(yùn)行截圖:
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。