一. 自動類型轉(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賦給變量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伯病。
二. 強制類型轉(zhuǎn)換
1. 當(dāng)把表數(shù)范圍大的值或是變量賦給表數(shù)范圍小的變量時,必須進(jìn)行強制轉(zhuǎn)換否过。
2. 強制轉(zhuǎn)換語法格式: (targetType)value
注意: 強制類型轉(zhuǎn)換類似于把大瓶子里的水倒入小瓶子中午笛。如果大瓶子里的水不夠裝滿小瓶子,那么不會出現(xiàn)問題苗桂。但是當(dāng)大瓶子水很多導(dǎo)致小瓶子裝不下時药磺,這時就會造成數(shù)據(jù)丟失。所以強制類型轉(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類型強轉(zhuǎn)為byte類型時矫俺,要截斷前24位,留后8位桥胞,即變?yōu)椋?/p>
1110 1001
這時恳守,符號位(即最左邊)上為1考婴,代表該數(shù)是負(fù)數(shù)贩虾。這里又涉及到另外一個知識點:負(fù)數(shù)在計算機(jī)里以補碼的形式存在。補碼是由原碼取反得到反碼沥阱,反碼加一得到的缎罢。所以我們要根據(jù)反碼計算出原碼大小。
1.補碼減1到得反碼:
補碼: 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)行強制轉(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)行強制轉(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 其實包含了一個隱式的強制轉(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!