溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

發(fā)布時(shí)間:2022-03-14 09:28:05 來(lái)源:億速云 閱讀:152 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制解析

概述

  • 自動(dòng)類(lèi)型轉(zhuǎn)換也叫隱式類(lèi)型轉(zhuǎn)換

  • 表達(dá)式的數(shù)據(jù)類(lèi)型自動(dòng)提升

所有的byte型、short型和char的值將被提升到int型。

如果一個(gè)操作數(shù)是long型,計(jì)算結(jié)果就是long型;

如果一個(gè)操作數(shù)是float型,計(jì)算結(jié)果就是float型;

如果一個(gè)操作數(shù)是double型,計(jì)算結(jié)果就是double型。

數(shù)據(jù)類(lèi)型只會(huì)自動(dòng)提升,不能自動(dòng)降低

int值可以賦值給long、float、double型變量,不能賦值給byte、short、char型變量

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

對(duì)于函數(shù)的傳參也是一樣

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

當(dāng)然,在有函數(shù)重載的情況下,java編譯器會(huì)自動(dòng)選擇最匹配的函數(shù)進(jìn)行調(diào)用

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

Java中整數(shù)默認(rèn)的數(shù)據(jù)類(lèi)型是int類(lèi)型

所有長(zhǎng)度低于int的類(lèi)型(byte、short、char)在運(yùn)算之后結(jié)果將會(huì)被提升為int型

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

當(dāng)然還有以下的這種情況,這種情況是因?yàn)槲覀冊(cè)谶M(jìn)行賦值運(yùn)算的時(shí)候,java編譯器可以明確知道運(yùn)算的結(jié)果是否超過(guò)byte或short的取值范圍,所以 byte a = 1 + 1; 并沒(méi)有報(bào)錯(cuò)。而上面 byte c = a + b; 編譯出錯(cuò)的原因是因?yàn)閍和b均為一個(gè)變量,相加的結(jié)果是否會(huì)超過(guò)byte的取值范圍編譯器并不知道,所以編譯器將結(jié)果提升為int型了。

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

小結(jié)一下:

  • 當(dāng)編譯器明確知道整數(shù)的運(yùn)算結(jié)果沒(méi)有到達(dá)int的表示范圍時(shí),byte、short或char類(lèi)型的運(yùn)算結(jié)果不會(huì)被自動(dòng)提升為int類(lèi)型

  • 當(dāng)編譯器明確知道或不清楚整數(shù)的運(yùn)算結(jié)果是否到達(dá)int的表示范圍時(shí),編譯器將會(huì)自動(dòng)將運(yùn)算的結(jié)果轉(zhuǎn)換成int,即使原來(lái)是byte、short或char類(lèi)型。

自動(dòng)類(lèi)型轉(zhuǎn)換 & 強(qiáng)制類(lèi)型轉(zhuǎn)換

什么時(shí)候會(huì)發(fā)生類(lèi)型轉(zhuǎn)換

答: 賦值 | 運(yùn)算時(shí) ,兩邊數(shù)據(jù)類(lèi)型不一致時(shí)就會(huì)發(fā)生類(lèi)型轉(zhuǎn)換

如下:

public class TypeTest {
    public static void main(String[] args){
       	// 運(yùn)算時(shí)發(fā)生的隱式類(lèi)型轉(zhuǎn)換,兩整數(shù)相除得到的還是一個(gè)整數(shù)
        byte a  = 3;
        byte b = 4;
        int num  =  a + b;
        System.out.println(num); // 7
        // 賦值時(shí)發(fā)生的隱式類(lèi)型轉(zhuǎn)換
        int ch = '0';
        System.out.println(ch); // 48
        // 運(yùn)算時(shí)發(fā)生的強(qiáng)制類(lèi)型轉(zhuǎn)換
        byte a1 = 12;
        byte a2 = 12;
        byte num1 = (byte)(a1  + a2);
        System.out.println(num1); // 24
        // 賦值時(shí)發(fā)生的強(qiáng)制類(lèi)型轉(zhuǎn)換
        short b3 = 1234;
        byte a3 = (byte) b3;
        System.out.println(a3); // -46
    }
}

運(yùn)行截圖:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

類(lèi)型轉(zhuǎn)換分類(lèi)

  • 自動(dòng)類(lèi)型轉(zhuǎn)換

  • 強(qiáng)制類(lèi)型轉(zhuǎn)換

自動(dòng)類(lèi)型轉(zhuǎn)換(隱式類(lèi)型轉(zhuǎn)換)

規(guī)則:從小到大 ,低字節(jié)向高字節(jié)自動(dòng)提升

順序:

byte(1字節(jié)) – > short(2字節(jié))-- > int(4字節(jié)) – > long(8字節(jié)) --> float(4字節(jié)) – > double(8字節(jié))

char (2字節(jié))-- > int(4字節(jié)) – > long(8字節(jié)) --> float(4字節(jié)) – > double(8字節(jié))

畫(huà)圖分析:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

代碼展示:

public class TypeDemo {
    public static void main(String[] agrs){
        // byte -- > short
        byte b1 = 127;
        short s1 = b1;
        System.out.println(s1); // 127
        // short -- > int 
        short  s2 = 30000;
        int i = s2;
        System.out.println(i); // 30000
        // int  -- > long
        int num = 2100000000;
        long lg = num;
        System.out.println(num); // 2100000000
        // long -- > float 
        long lg1 = 200000000000000L;
 	    float f1 = lg1;
        System.out.println(f1);// 2.00000001E14
        // float -- > double 
        float f2 = 3.14f;
        double d1 = f2;
 	    System.out.println(d1); // 3.140000104904175
        // char -- > int
	    char ch = 'a';
        int i1 = ch ;
        System.out.println(i1); // 97
        // char -- > long
        char ch2 = 'b';
        long lg2 = ch2;
        System.out.println(lg2); // 98
        // char  -- >  double
        char ch3 = 'c';
        double dou = ch3;
        System.out.println(dou); // 99.0
        // char -- > float
        char ch4 = 'd';
        float  f3 = ch4;
        System.out.println(f3); // 100.0
    }
}

運(yùn)行截圖:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

注意:

byte、short不能和char進(jìn)行相互轉(zhuǎn)換

代碼展示:

public class TypeDemo2 {
    public static void main(String[] agrs){
 	    // byte -- > char
        byte bt = 127;
        char ch = bt;
        System.out.println(ch);
        // short -- > char
        short sh = 12;
        char ch2 = sh;
        System.out.println(ch2);
    }
}

編譯錯(cuò)誤截圖:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

float雖然是4個(gè)字節(jié),但是float比long表示的數(shù)據(jù)范圍更大。說(shuō)明數(shù)據(jù)范圍的大小和字節(jié)的大小不一定相關(guān)

代碼展示:

public class TypeDemo3 {
    public static void main(String[] agrs){
        long lg = 20000000000000L;
        float f1 = lg;
        System.out.println(f1); // 1.99999997E13
    }
}

運(yùn)行截圖:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

boolean類(lèi)型不能參與類(lèi)型轉(zhuǎn)換

代碼展示:

public class TypeDemo4 {
    public static void main(String[] agrs) {
        boolean flag = 12;
        int flag1 = flag;
        System.out.println(flag1);
    }
}

編譯錯(cuò)誤截圖:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

強(qiáng)制類(lèi)型轉(zhuǎn)換(顯式類(lèi)型轉(zhuǎn)換)

規(guī)則:從大到小,高字節(jié)向低字節(jié)手動(dòng)強(qiáng)制轉(zhuǎn)換

順序:

double(8字節(jié)) – > float(4字節(jié)) – > long(8字節(jié)) – > int(4字節(jié)) – > short (2字節(jié))-- > byte(1字節(jié))

double(8字節(jié)) – > float(4字節(jié)) – > long(8字節(jié)) – > int(4字節(jié)) – > char(2字節(jié))

畫(huà)圖分析:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

(掌握)格式:目標(biāo)數(shù)據(jù)類(lèi)型 變量名 = (目標(biāo)數(shù)據(jù)類(lèi)型) 變量 | 常量;

代碼展示:

public class TypeDemo5 {
    public static void main(String[] agrs){
        // float -- > long
        // final float  PI = 3.14f;
        // long num = (long) PI; // 3
        // float little =  3.14f;
        // long num = (long)little; // 3
 	    long num = (long)3.14f;      
        System.out.println(num);// 3 
        // double -- > float 
        // double dou = 3.14;
        // float little1 = (float)dou; // 3.14
        //  float little1 = (float) 3.14d;  // 3.14
        final double  dou = 3.14;
        float little1 = (float)dou;
        System.out.println(little1); // 3.14
        // long -- > int 
        // long  num1 = 2000000000000L;
        // int   num2 = (int)num1;  // -1454759936
        // int num2 = (int)2000000000000L; // -1454759936
       	final  long num1 = 2000000000000L;
        int num2 = (int)num1;
        System.out.println(num2);  // -1454759936
        // int --> short
        // int  num3  = 12;
        // short num4 = (short)num3; // 12
        // short num4 = (short)40000; // -25536
        final int num3 = 60;
        short num4 = (short)num3;
        System.out.println(num4); // 60
        // short -- > byte
        final short sh = 12345;
        byte bt = (byte)sh;
        System.out.println(bt); // 57
        short sh2 = 78;
	    bt = (byte) sh2;
        System.out.println(bt); // 78
    }
}

運(yùn)行截圖:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

注意:

強(qiáng)制類(lèi)型轉(zhuǎn)換有數(shù)據(jù)丟失,一般不建議使用

代碼展示:

public  class TypeDemo6 {
   public static void main(String[] agrs) {
       short a = 1245;
       byte b = (byte)a;
       System.out.println(b);
   } 
}

運(yùn)行截圖:

java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“java中類(lèi)型自動(dòng)轉(zhuǎn)換機(jī)制的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI