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é)果是否超過byte或short的取值范圍,所以 byte a = 1 + 1; 并沒有報(bào)錯(cuò)。而上面 byte c = a + b; 編譯出錯(cuò)的原因是因?yàn)閍和b均為一個(gè)變量,相加的結(jié)果是否會(huì)超過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)文章
學(xué)習(xí)不同 Java.net 語(yǔ)言中類似的函數(shù)結(jié)構(gòu)
這篇文章主要介紹了學(xué)習(xí)不同 Java.net 語(yǔ)言中類似的函數(shù)結(jié)構(gòu),函數(shù)式編程語(yǔ)言包含多個(gè)系列的常見函數(shù)。但開發(fā)人員有時(shí)很難在語(yǔ)言之間進(jìn)行切換,因?yàn)槭煜さ暮瘮?shù)具有不熟悉的名稱。函數(shù)式語(yǔ)言傾向于基于函數(shù)范例來(lái)命名這些常見函數(shù)。,需要的朋友可以參考下2019-06-06
java long轉(zhuǎn)String +Codeforces110A案例
這篇文章主要介紹了java long轉(zhuǎn)String +Codeforces110A案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-09-09
Java實(shí)現(xiàn)word/pdf轉(zhuǎn)html并在線預(yù)覽
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)word、pdf文件轉(zhuǎn)html并在線預(yù)覽的功能,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-05-05
Spring-webflux?響應(yīng)式編程的實(shí)例詳解
Spring 提供了兩個(gè)并行堆棧,一種是基于帶有 Spring MVC 和 Spring Data 結(jié)構(gòu)的 Servlet API,另一個(gè)是完全反應(yīng)式堆棧,它利用了 Spring WebFlux 和 Spring Data 的反應(yīng)式存儲(chǔ)庫(kù),這篇文章主要介紹了Spring-webflux?響應(yīng)式編程,需要的朋友可以參考下2022-09-09
java token生成和校驗(yàn)的實(shí)例代碼
這篇文章主要介紹了java token生成和校驗(yàn)的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-09-09

