基本類型的類型轉(zhuǎn)換


一. 自動類型轉(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é)果::編譯錯誤。如下圖:

運行結(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é)果如下圖:

運行結(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!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,564評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評論 18 399
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 4,194評論 1 10
  • 1.在很多時候能拯救你的只有你自己 以前我總覺得有一個人會來拯救我,他會監(jiān)督我學(xué)習(xí),教我功課,在我玩手機(jī)的時候假裝...
    倆年閱讀 485評論 2 4
  • 周五下了英語,我開始很焦慮。周六上午的課下午的班會要錄的視頻周末的學(xué)習(xí)班比賽作業(yè)線代考試。吃飯回了宿舍還要下去打水...
    黑夜不再來閱讀 280評論 1 1

友情鏈接更多精彩內(nèi)容