java中的類型自動(dòng)轉(zhuǎn)換機(jī)制解析
類型自動(dòng)轉(zhuǎn)換機(jī)制解析
概述
- 自動(dòng)類型轉(zhuǎn)換也叫隱式類型轉(zhuǎn)換
- 表達(dá)式的數(shù)據(jù)類型自動(dòng)提升
所有的byte型、short型和char的值將被提升到int型。
如果一個(gè)操作數(shù)是long型,計(jì)算結(jié)果就是long型;
如果一個(gè)操作數(shù)是float型,計(jì)算結(jié)果就是float型;
如果一個(gè)操作數(shù)是double型,計(jì)算結(jié)果就是double型。
數(shù)據(jù)類型只會(huì)自動(dòng)提升,不能自動(dòng)降低
int值可以賦值給long、float、double型變量,不能賦值給byte、short、char型變量
對(duì)于函數(shù)的傳參也是一樣
當(dāng)然,在有函數(shù)重載的情況下,java編譯器會(huì)自動(dòng)選擇最匹配的函數(shù)進(jìn)行調(diào)用
Java中整數(shù)默認(rèn)的數(shù)據(jù)類型是int類型
所有長(zhǎng)度低于int的類型(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; 并沒有報(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é)果沒有到達(dá)int的表示范圍時(shí),byte、short或char類型的運(yùn)算結(jié)果不會(huì)被自動(dòng)提升為int類型
- 當(dāng)編譯器明確知道或不清楚整數(shù)的運(yùn)算結(jié)果是否到達(dá)int的表示范圍時(shí),編譯器將會(huì)自動(dòng)將運(yùn)算的結(jié)果轉(zhuǎn)換成int,即使原來(lái)是byte、short或char類型。
自動(dòng)類型轉(zhuǎn)換 & 強(qiáng)制類型轉(zhuǎn)換
什么時(shí)候會(huì)發(fā)生類型轉(zhuǎn)換
答: 賦值 | 運(yùn)算時(shí) ,兩邊數(shù)據(jù)類型不一致時(shí)就會(huì)發(fā)生類型轉(zhuǎn)換
如下:
public class TypeTest { public static void main(String[] args){ // 運(yùn)算時(shí)發(fā)生的隱式類型轉(zhuǎn)換,兩整數(shù)相除得到的還是一個(gè)整數(shù) byte a = 3; byte b = 4; int num = a + b; System.out.println(num); // 7 // 賦值時(shí)發(fā)生的隱式類型轉(zhuǎn)換 int ch = '0'; System.out.println(ch); // 48 // 運(yùn)算時(shí)發(fā)生的強(qiáng)制類型轉(zhuǎn)換 byte a1 = 12; byte a2 = 12; byte num1 = (byte)(a1 + a2); System.out.println(num1); // 24 // 賦值時(shí)發(fā)生的強(qiáng)制類型轉(zhuǎn)換 short b3 = 1234; byte a3 = (byte) b3; System.out.println(a3); // -46 } }
運(yùn)行截圖:
類型轉(zhuǎn)換分類
- 自動(dòng)類型轉(zhuǎn)換
- 強(qiáng)制類型轉(zhuǎn)換
自動(dòng)類型轉(zhuǎn)換(隱式類型轉(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é))
畫圖分析:
代碼展示:
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 ch1 = 'b'; long lg2 = ch1; System.out.println(lg2); // 98 // char -- > double char ch2 = 'c'; double dou = ch2; System.out.println(dou); // 99.0 // char -- > float char ch3 = 'd'; float f3 = ch3; 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 ch1 = sh; System.out.println(ch1); } }
編譯錯(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類型不能參與類型轉(zhuǎn)換
代碼展示:
public class TypeDemo4 { public static void main(String[] agrs) { boolean flag = 12; int flag1 = flag; System.out.println(flag1); } }
編譯錯(cuò)誤截圖:
強(qiáng)制類型轉(zhuǎn)換(顯式類型轉(zhuǎn)換)
規(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é))
畫圖分析:
(掌握)格式:目標(biāo)數(shù)據(jù)類型 變量名 = (目標(biāo)數(shù)據(jù)類型) 變量 | 常量;
代碼展示:
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 sh1 = 78; bt = (byte) sh1; System.out.println(bt); // 78 } }
運(yùn)行截圖:
注意:
強(qiáng)制類型轉(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)行截圖:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java中的BaseTypeHandler自定義類型轉(zhuǎn)換器的使用
- Java基本數(shù)據(jù)類型之間的相互轉(zhuǎn)換詳解
- Java實(shí)現(xiàn)各種文件類型轉(zhuǎn)換方式(收藏)
- Java之int和string類型轉(zhuǎn)換詳解
- java 實(shí)現(xiàn)將Object類型轉(zhuǎn)換為int類型
- Java中Object轉(zhuǎn)換為L(zhǎng)ist類型的實(shí)現(xiàn)方法
- Java將Date日期類型字段轉(zhuǎn)換成json字符串的方法
- Java數(shù)據(jù)類型分類與基本數(shù)據(jù)類型轉(zhuǎn)換
相關(guān)文章
Java中notify()和notifyAll()的使用區(qū)別
本文主要介紹了Java中notify()和notifyAll()的使用區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2021-06-06mybatis中關(guān)于type-aliases-package的使用
這篇文章主要介紹了mybatis中關(guān)于type-aliases-package的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08spring用戶通過(guò)交互界面登錄成功的實(shí)現(xiàn)
本文主要介紹了spring用戶通過(guò)交互界面登錄成功的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07走進(jìn)SpringBoot之配置文件與多環(huán)境詳解
這篇文章主要介紹了走進(jìn)SpringBoot之配置文件與多環(huán)境,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05使用httpclient實(shí)現(xiàn)免費(fèi)的google翻譯api
這篇文章主要介紹了使用httpclient實(shí)現(xiàn)免費(fèi)的google翻譯api的方法,大家參考使用吧2014-01-01基于 SpringBoot 實(shí)現(xiàn) MySQL 讀寫分離的問題
這篇文章主要介紹了基于 SpringBoot 實(shí)現(xiàn) MySQL 讀寫分離的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02