一. 自動類型轉(zhuǎn)換
Java中所有的數(shù)值類型變量都可以相互轉(zhuǎn)換。
1. 系統(tǒng)支持把某種基本類型的值或是變量賦給另一種基本類型的變量,這種方式被稱為自動類型轉(zhuǎn)換。換句話說,將一個表數(shù)范圍小的數(shù)值或是變量賦給另一個表數(shù)范圍大的變量時,系統(tǒng)可以進(jìn)行自動類型轉(zhuǎn)換。
2. 自動類型轉(zhuǎn)換圖
byte --> short --> int --> long --> float --> double
注意:char類型可以轉(zhuǎn)換成為int類型,但是不能轉(zhuǎn)換成為byte類型和short類型。
3. 當(dāng)任何基本類型與字符串進(jìn)行連接運算時,都會將值自動轉(zhuǎn)換為字符串類型。
4. 代碼演示
a):
class Test {
public static void main(String[] args) {
int a = 6;
float f = a;
System.out.println(f);
}
}
執(zhí)行結(jié)果:6.0。
解析:因為變量a是int類型,所以當(dāng)把a(bǔ)賦給變量f時,系統(tǒng)自動將int類型轉(zhuǎn)換為float類型。
b):
class Test {
public static void main(String[] args) {
byte b = 9;
char c = b;
System.out.println(c);
}
}
執(zhí)行結(jié)果:報錯。
解析:因為byte類型和char類型之間不能進(jìn)行轉(zhuǎn)換。
c):
class Test {
public static void main(String[] args) {
System.out.println("Hello" + 3 + 4); //①
System.out.println(3 + 4 + "Hello"); //②
}
}
執(zhí)行結(jié)果::①為 Hello34; ②為7Hello。
解析:①:系統(tǒng)會先執(zhí)行"Hello" + 3 ,3為int類型,所以要進(jìn)行類型轉(zhuǎn)換,將int類型變成String類型,得出結(jié)果"Hello3",同理可得"Hello34"。
②:同樣的系統(tǒng)會先執(zhí)行3 + 4 。3,4為同類型,即int類型,所以可得結(jié)果7.然后將7與"Hello"進(jìn)行連接。得出結(jié)果7Hello。
二. 強(qiáng)制類型轉(zhuǎn)換
1. 當(dāng)把表數(shù)范圍大的值或是變量賦給表數(shù)范圍小的變量時,必須進(jìn)行強(qiáng)制轉(zhuǎn)換。
2. 強(qiáng)制轉(zhuǎn)換語法格式: (targetType)value
注意: 強(qiáng)制類型轉(zhuǎn)換類似于把大瓶子里的水倒入小瓶子中。如果大瓶子里的水不夠裝滿小瓶子,那么不會出現(xiàn)問題。但是當(dāng)大瓶子水很多導(dǎo)致小瓶子裝不下時,這時就會造成數(shù)據(jù)丟失。所以強(qiáng)制類型轉(zhuǎn)換也成為“縮小轉(zhuǎn)換”。
3. 代碼演示
a):
class test
{
public static void main (String[] args) throws java.lang.Exception
{
int a = 233;
byte b = (byte)a;
System.out.println(b);
}
}
執(zhí)行結(jié)果:: -23。
解析:因為變量a是int類型,占32位,4字節(jié)。所以233在內(nèi)存中表現(xiàn)形式為:
0000 0000 0000 0000 0000 0000 1110 1001
而變量b是byte類型,占8位,1字節(jié)。所以當(dāng)我們將int類型強(qiáng)轉(zhuǎn)為byte類型時,要截斷前24位,留后8位,即變?yōu)椋?/p>
1110 1001
這時,符號位(即最左邊)上為1,代表該數(shù)是負(fù)數(shù)。這里又涉及到另外一個知識點:負(fù)數(shù)在計算機(jī)里以補(bǔ)碼的形式存在。補(bǔ)碼是由原碼取反得到反碼,反碼加一得到的。所以我們要根據(jù)反碼計算出原碼大小。
1.補(bǔ)碼減1到得反碼:
補(bǔ)碼: 1110 1001
反碼: 1110 1000
2.反碼取反得到原碼:
反碼: 1110 1000
原碼: 1001 0111
得出原碼為-23。
b):
class test
{
public static void main (String[] args) throws java.lang.Exception
{
float a = 5.6;
System.out.println(a);
}
}
執(zhí)行結(jié)果::編譯錯誤。如下圖:

解析:因為5.6默認(rèn)的數(shù)據(jù)類型是double類型,所以將double類型賦給float類型變量時,要進(jìn)行強(qiáng)制轉(zhuǎn)換。
正確代碼: float a = (float)5.6;
三. 表達(dá)式類型的自動提升
1. 當(dāng)一個算數(shù)表達(dá)式中包含多個基本類型的值時,整個算術(shù)表達(dá)式的數(shù)據(jù)類型將會自動提升。
2. 自動提升規(guī)則:
a. 所有byte類型,short類型,char類型都將被提升至int類型
b. 整個算數(shù)表示式的數(shù)據(jù)類型自動提升到與表達(dá)式中最高等級操作數(shù)相同的類型。
3. 代碼演示
a):
class test
{
public static void main (String[] args) throws java.lang.Exception
{
short a = 2;
a = a + 2;
System.out.println(a);
}
}
執(zhí)行結(jié)果:報錯。結(jié)果如下圖:

解析:因為變量a為short類型,當(dāng)它進(jìn)行運算時會自動提升為int類型。而將一個int類型的值賦給short類型的變量要進(jìn)行強(qiáng)制轉(zhuǎn)換。否則就會報錯。
b):
class test
{
public static void main (String[] args) throws java.lang.Exception
{
short a = 2;
a += 2 ;
System.out.println(a);
}
}
執(zhí)行結(jié)果: 4。
解析: 這里我們可以會出現(xiàn)疑問了:為什么 a = a + 2 會報錯,而 a += 2 就是正確的語句。因為 a += 2 其實包含了一個隱式的強(qiáng)制轉(zhuǎn)換。 a += 2 相當(dāng)與(short)(a + 2),所以不會報錯。
c):
class test
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println("Hello!" + 'a' + 7); // ①
System.out.println('a' + 7 + "Hello!"); // ②
}
}
執(zhí)行結(jié)果:①:Hello!a7;②:104Hello!
解析:①:對于"Hello!" + 'a' + 7表達(dá)式,系統(tǒng)會先進(jìn)行 "Hello!" + 'a'運算,把'a'轉(zhuǎn)化成字符串與"Hello!"進(jìn)行字符串拼接,得出"Hello!a"。然后在進(jìn)行"Hello!a" + 7,這里也是字符串拼接,從而得到結(jié)果:Hello!a7。
②:對于'a' + 7 + "Hello!"表達(dá)式,系統(tǒng)先進(jìn)行的是'a' + 7運算。這里'a'為char類型,所以要自動提升為int類型,變成對應(yīng)的ASCII碼:97。在進(jìn)行加7運算得出104。然后在于"Hello"進(jìn)行字符串拼接,最后得出結(jié)果:104Hello!