天天看點

java 基本資料類型

java 基本資料類型

類型轉換:

基本資料類型(boolean除外)之間可以互相轉換。

引用類型轉換的前提是存在繼承或實作關系。

在強轉之前,建議先使用instanceof 關鍵字判斷。接口引用也可以利用instanceof關鍵字判斷是否是子類的一個執行個體。

Integer 和 Long 之間沒有繼承和實作的關系,是以不能強轉。

Long i = (Long)new Integer(100); // Cannot cast from Integer to Long

或者      
Integer i = 100;
Object obj = (Long)i; // Cannot cast from Integer to Long      

1、java 基本資料類型四類八種:

  byte、short、int、long、float、double、char、boolean

2、類型轉換

  八種基本類型boolean 除外,其它七種都可以互相轉換。

  自動轉換,小類型轉大類型。

  強轉,大類型轉小類型。

  例外(不需要強轉):為了友善起見,int類型字面直接量可以直接指派給byte、short、char,隻是不能超出範圍,如:

java 基本資料類型
java 基本資料類型
public class Test {
     byte b  = 50;
     byte b1 = 100+1;//java編譯器會自動運算為101,是以視為直接量
     byte b2 = b+1;  //這個不是直接量,報錯
     byte b3 = 255;  //超出範圍了,報錯
}      

View Code

java 基本資料類型

  超出範圍的強轉會丢失精度,因為不同類型所占位元組不同,大類型轉小類型會果斷地把高位砍掉,如:

java 基本資料類型
java 基本資料類型
public class Test {
    public static void main(String[] args) {
        byte b = 67;
        byte b2 = 89;
        byte b3 = (byte) (b + b2);
        // int值156的記憶體表示:
        // 0000 0000 0000 0000 0000 0000 1001 1100
        // 砍掉高24位                          1001 1100
        // 電腦輸入十進制-100,轉為二進制正好為   1001 1100
        System.out.println(b3);// 輸出為-100
    }
}      
java 基本資料類型

  強制轉換類型不會涉及到溢出,因為它是直接把高位砍掉,留下的低位一定可以被轉換後的類型表示。

java 基本資料類型
java 基本資料類型
public class Test {
    public static void main(String[] args) {
        long l = 2147483648L*2+12345;//4294979641
        /* 
         * 4294979641的二進制表示為(64位):
         * 00000000000000000000000000000001
         * 00000000000000000011000000111001
         * 砍掉高32位:
         * 00000000000000000011000000111001
         * 對應的數十進制數為:12345
         */
        int i = (int) l;
        System.out.println(i);//i=12345
    }
}      

View Code  

  正常情況下,double 也可以強轉為float ; 但如果超出範圍,強轉不過來,因為有一個小數點,如果也随便地砍掉,格式就不對了。不過即使這樣也沒有文法錯誤,運作時也沒有錯誤,隻是結果不是我們想要的結果,結果為Infinity。

java 基本資料類型
java 基本資料類型
public class Test {
    public static void main(String[] args) {
//        float f1 = 1.1;// 報錯
        float f2 = (float) 1.1;
        float f3 = (float) (1.1 * 10E300);// 不報錯,但結果為無窮大
//        float f5 = 1.0*10E39L;// 報錯
        float f6 = (float)(1.0*10E39);//結果為無窮大
        System.out.println(f2);
        System.out.println(f3);
        System.out.println(f6);
    }
}      

 3、運算

  小類型和大類型運算時,小類型自動轉為大類型。

  byte、short、char 參加運算時,首先轉換為int 型,如:

java 基本資料類型
java 基本資料類型
public static void main(String[] args) {
        byte b  = 1;
        byte b1 = 2;
        byte b2 = (byte)(b + b1);
        int  i  = b + b1;
    }      

  如果運作的結果超出了表示範圍,那麼就會溢出,溢出不會報錯。

java 基本資料類型
java 基本資料類型
public static void main(String[] args) {
        byte b1  = 127;
        byte b2  = 1;
        byte b3 = (byte)(b1+b2);
        System.out.println(b3);//輸出-128
    }      

4、也可以把八進制(以0打頭)、十六進制(以0x或0X打頭)數指派給byte、short、int、long、float、double、char。

java 基本資料類型
java 基本資料類型
public class Test {
     public static void main(String[] args) {
         byte   b = -100,  b2 = -0100,  b3 = -0X10;
         short  s =  100,  s2 =  0100,  s3 =  0x10;
         int    i =  100,  i2 =  0100,  i3 =  0x10;
         long   l =  100,  l2 =  0100,  l3 =  0x10;
         float  f =  100,  f2 =  0100,  f3 =  0x10;
         double d =  100,  d2 =  0100,  d3 =  0x10;
         char   c =  100,  c1 =  0100,  c3 =  0x10;
    }
}      
java 基本資料類型

  但十六進制的不能指派為浮點數類型:

java 基本資料類型
java 基本資料類型
public class Test {
     public static void main(String[] args) {
         double d = 100.1,  d2 = 0100.1;//這一行正常
         double d3 = 0x10.1;//這一行報錯
    }
}      

  也可以使用十六進制的另外一種形式指派給它們,但一定要在char 所表示的範圍内。

java 基本資料類型
java 基本資料類型
public class Test {
     public static void main(String[] args) {
         byte   b = '\u0001';
         short  s = '\u1111';
         int    i = '\udddd';   
         int     i2 ='\u11111';//報錯,因為這裡有5位,對應20位二進制數。
         long   l = '\uffff';
         char   c = '\uffff';
         float  f = '\uffff';
         double d = '\uffff';
         double d2 ='\uffffff';//報錯,因為這裡有5位,對應20位二進制數。
         //20位二進制的數超出了char的表示範圍,char是16位的。
         System.out.println("b="+b+",s="+s+",i="+i+",l="+l+",c="+c+",f="+f+",d="+d);
    }
}      
java 基本資料類型
java 基本資料類型
java 基本資料類型

5、char 類型

  java 為了實作跨平台,使用Unicode 編碼,Unicode 又分為2 種,UTF-8 和UTF-16。

  java 采用的是UTF-16 編碼方式,是以一個字元在記憶體中占用兩個位元組,比如‘a’ 這個字元在記憶體中也占用兩個位元組。

  char 類型的聲明:

  char c1 = '中';

  char c2 = 97;

  char c3 = '\u0061';

  97和 0061分别是十進制和十六進制的,各自都有對應的二進制形式,即它們在記憶體中的存儲形式,一個二進制數對應Unicode 字元集中的一個确定的字元。

  97預設是int 類型的,對應的二進制數為0000 0000 0000 0000 0000 0000 0110 0001,一共四個位元組,32位;類型轉換,砍掉高位的兩個位元組變為兩個位元組,16位:0000 0000 0110 0001,這個二進制數會對應Unicode 字元集裡的一個字元。

6、浮點型資料

  單精度浮點型、雙精度浮點型

  聲明為十進制形式的:float f = 3.14

  聲明為科學記數法形式的:float f = 3.14e10F, f2 = 3.14E10f, f3 = 3.14E-10F;

  0——1之間有無數個浮點數,是以浮點數是有誤差的。在第幾位出現誤差叫做精度。float 7位,double 15位。

  0.1内部用0.0999很多個9來模拟。

  計算機裡的浮點數是離散的,現實中的浮點數是連續的、無窮的。