??Java語言規(guī)定:當(dāng)一個(gè)算術(shù)表達(dá)式中包含多個(gè)基本類型的值時(shí),整個(gè)算術(shù)表達(dá)式的數(shù)據(jù)類型將發(fā)生自動(dòng)提升。Java語言中的自動(dòng)提升規(guī)則如下:
所有byte型疟游、short型和char型將被提升為int型
這個(gè)算術(shù)表達(dá)式的數(shù)據(jù)類型自動(dòng)提升到與表達(dá)式中最高等級(jí)操作數(shù)同樣的類型。操作數(shù)的等級(jí)排列如下所示:
例子:
public class Main {
public static void main(String args[]) {
//定義一個(gè)short類型的變量
short s=4;
//表達(dá)式中的s將自動(dòng)提升到int類型鸳兽,則右邊的表達(dá)式類型為int
//將一個(gè)int類型賦給short類型的變量時(shí)將發(fā)生錯(cuò)誤
s=s-2;
byte b=2;
char c='a';
int i=23;
double d=.324;
//右邊表達(dá)式中在最高等級(jí)操作數(shù)為d(double型)
//則右邊表達(dá)式的類型為double型,故賦給一個(gè)double型變量
double result=b+c+i*d;
System.out.println(result);
int val=3;
//右邊表達(dá)式中2個(gè)操作數(shù)都是int罕拂,故右邊表達(dá)式的類型為int
//因此揍异,雖然23/3不能除盡,依然得到一個(gè)int整數(shù)
int intResult=23/val;
System.out.println(intResult);
//程序自動(dòng)將7爆班、'a'等基本類型轉(zhuǎn)化為字符串蒿秦,輸出字符串Hello!a7
System.out.println("Hello!"+'a'+7);
//程序?qū)?a'當(dāng)成int處理,因此'a'+7得到104蛋济,輸出字符串104Hello!
System.out.println('a'+7+"Hello!");
}
}
??在復(fù)合賦值運(yùn)算符中有點(diǎn)不同,由前面的介紹可知炮叶,下面的語句會(huì)引起編譯錯(cuò)誤:
short s=4;
s=s-2;
因?yàn)閟-2表達(dá)式的類型將自動(dòng)提升為int類型碗旅,所以程序?qū)⒁粋€(gè)int類型的變量賦給s時(shí)導(dǎo)致了編譯錯(cuò)誤。但是下面形式就沒有任何問題:
short s=4;
s-=2;
上面的表達(dá)式使用了復(fù)合賦值運(yùn)算符镜悉,此時(shí)將不會(huì)產(chǎn)生編譯錯(cuò)誤祟辟。Java語言幾乎允許所有的雙目運(yùn)算符和=一起結(jié)合成復(fù)合賦值運(yùn)算符,如+=侣肄、-=旧困、*=、/=稼锅、%=吼具、<<=、>>=矩距、>>>=拗盒、&=、^=锥债、|=等陡蝇。根據(jù)Java語言規(guī)范,復(fù)合賦值運(yùn)算符包含了一個(gè)隱式的類型轉(zhuǎn)換哮肚,即:
a+=5;
等價(jià)于
a=(a的類型)(a+5);
也就是說登夫,復(fù)合賦值運(yùn)算符會(huì)自動(dòng)地將它計(jì)算的結(jié)果值強(qiáng)制類型轉(zhuǎn)換為其左側(cè)變量的類型,強(qiáng)制類型轉(zhuǎn)換將有可能導(dǎo)致高位"截?cái)?允趟。