原創聲明:本文為作者原創,未經允許不得轉載,經授權轉載需注明作者和出處
在數據類型那章我們學習了java的八大基本類型,我們發現。除了boolean類型,其它的幾種類型都是數(char類型也可以看成是數)。那么既然都是數,那么他們之間能不能相互轉換呢?
基本類型之間的轉換我們分為以下幾種情況
由于目前所學知識的限制,我們今天只講去前五種情況。
首先,我們來看看第一種情況:小范圍向大范圍轉換
這里的小范圍和大范圍指的是數據的范圍,都是相對的概念,比如int相對于Long就是小范圍,相對于byte就是大范圍。
現在,我們有一個int類型的變量a,給它 賦值為10,然后我們再申明個long類型的變量b,然后我們把a賦值給b,我們輸出一下b的值,這就是第一種情況,小范圍向大范圍轉換:
int a = 1;
long b = a;
System.out.println(b);
你會發現這跟普通的賦值好像沒有什么區別。這是因為long類型的范圍本來就比int大,jvm虛擬機自動就處理了(神奇的jvm),就好比把小盒子里的東西放到大盒子,直接倒進去就行了。
如果我們反過來試一下,會發現:
a處報了錯,說明編譯沒通過,鼠標放在a上,立馬顯示了錯誤提示
Type mismatch: cannot convert from long to int
意思是不能將long類型轉換為int類型,并且給出了三個解決方案,我們點一下“add cast to int這個”,這個方案是講a強轉成int(另外兩種大家可以自己試一試),于是代碼變成了:
long a = 1l;
int b = (int) a;
System.out.println(b);
沒錯,在變量前面加上(int)就完成了強轉。
但是,我們前面提到long范圍比int類型的大,還用盒子做了比喻,有的童鞋可能會問:如果大盒子里的東西超出小盒子儲存的范圍會怎樣?比如我a的值一開始就弄個10000000000l,我們來看代碼:
long a = 10000000000l;
int b = (int) a;
System.out.println(b);
運行的結果卻是1410065408,當然,再多加幾個0可能還會變成負數,這結果顯然不對啊。這是因為long存放的東西超出了int能接受的范圍,導致內存溢出了,具體的原理需要講到底層二進制代碼,有興趣的童鞋可以自己去查查資料。
由以上兩條可以總結出:
float a = 1.23f;
double b = a;
System.out.println(b);
我們的運行結果是1.2300000190734863,我們的1.23可以看成是這個數四舍五入之后保留兩位小數之后留下來的,這就說明,這個數的精確度比1.23高,所以結果是對的。double a = 1.23d;
float b = (float) a;
System.out.println(b);
結果自然毫無疑問是1.23,那么其實我們的高低精度轉換也可以看成是大小盒子的問題,那么會和long轉int一樣出現內存問題么,比如:double a = 1.255555555555555d;
float b = (float) a;
System.out.println(b);
可以根據我們的運行結果“1.2555555”看出,并不會出現這個問題,后面的位數數被我們神奇的jvm虛擬機自動去掉了。當然,我們的int,long byte等等可以看成是精度為0的小數,因此也符合這個以上兩條規則
還記得在講字符串的時候,我們講過這樣一個例子:
int a = 1;
int b = 2;
System.out.println(""+a+b);
當時講過這個輸出的結果為什么么是12而不是3,原因是當前面拼接上了字符串之后,后面的會自動被強轉為字符串拼接起來,那么基本類型向字符串轉換這個情況的規律就是:
那么為什么是在前面拼接不能在后面拼接呢?我們可以運行下面代碼做個試驗:
int a = 1;
int b = 2;
System.out.println(a+b+""+a+b);
相信看到結果“312”的你應該懂了吧。