Java基本數據類型
基本類型,或者叫做內置類型,是Java中不同於類的特殊類型。
- Java中定義了四類八種基本數據類型:
布爾型:boolean
字符型:char
整數型:byte,short,int,long
浮點數型:float,double
數據類型 | 關鍵字 | 在內存中占用字節數 | 取值范圍 | 默認值 |
---|---|---|---|---|
布爾型 | boolean | 1 | true,false | false |
字符型 | char | 2 | 0~2^16-1 | '\u0000' |
字節型 | byte | 1 | -128~127 | 0 |
短整型 | short | 2 | -215~215-1 | 0 |
整型 | int | 4 | -231~231-1 | 0 |
長整型 | long | 8 | -263~263-1 | 0 |
單精度浮點型 | float | 4 | 1.4013E-45~ 3.4028E+38 | 0.0F |
雙精度浮點型 | double | 8 | 4.9E-324~1.7977E+308 | 0.0D |
Float和Double的最小值和最大值都是以科學記數法的形式輸出的,結尾的“E+數字”表示E之前的數字要乘以10的多少倍。比如3.14E3就是3.14×1000=3140,3.14E-3就是3.14/1000=0.00314。
實例:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// byte
System.out.println("基本類型:byte 二進制位數:" + Byte.SIZE);
System.out.println("包裝類:java.lang.Byte");
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println("基本類型:short 二進制位數:" + Short.SIZE);
System.out.println("包裝類:java.lang.Short");
System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println("基本類型:int 二進制位數:" + Integer.SIZE);
System.out.println("包裝類:java.lang.Integer");
System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println("基本類型:long 二進制位數:" + Long.SIZE);
System.out.println("包裝類:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println("基本類型:float 二進制位數:" + Float.SIZE);
System.out.println("包裝類:java.lang.Float");
System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println("基本類型:double 二進制位數:" + Double.SIZE);
System.out.println("包裝類:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println("基本類型:char 二進制位數:" + Character.SIZE);
System.out.println("包裝類:java.lang.Character");
// 以數值形式而不是字符形式將Character.MIN_VALUE輸出到控制台
System.out.println("最小值:Character.MIN_VALUE="+ (int) Character.MIN_VALUE);
// 以數值形式而不是字符形式將Character.MAX_VALUE輸出到控制台
System.out.println("最大值:Character.MAX_VALUE="+ (int) Character.MAX_VALUE);
}
}
結果:
基本類型:byte 二進制位數:8
包裝類:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127
基本類型:short 二進制位數:16
包裝類:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767
基本類型:int 二進制位數:32
包裝類:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647
基本類型:long 二進制位數:64
包裝類:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807
基本類型:float 二進制位數:32
包裝類:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38
基本類型:double 二進制位數:64
包裝類:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308
基本類型:char 二進制位數:16
包裝類:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535
-
裝箱和拆箱
自動裝箱是Java編譯器在基本數據類型和對應的對象包裝類型之間做的一個轉化。比如:把int轉化成Integer,double轉化成Double,等等。反之就是自動拆箱。
原始類型:boolean,char,byte,short,int,long,float,double
封裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,Double -
基本類型之間的轉換
將一種類型的值賦值給另一種類型是很常見的。在Java中,boolean類型與其他7種類型的數據都不能進行轉換,這一點很明確。但對於其他7種數據類型,它們之間都可以進行轉換,只是可能會存在精度損失或其他一些變化。
轉換分為自動轉換與強制轉換:
自動轉換(隱式):無需任何操作。
強制轉換(顯示):需使用轉換操作符(type)。
將6種數據類型按下面順序排列一下:
double>float>long>int>short>byte
如果從小轉換到大,那么可以直接轉換,而從大到小,或char和其他6種數據類型轉換,則必須使用強制轉換。
1、自動轉換(JVM自動完成)
自動轉換時發生擴寬。因為較大的類型(如int)要保存較小的類型(如byte),內存總是足夠的,不需要強制轉換。如果將字面值保存到byte、short、char、long的時候,也會自動進行類型轉換。注意區別,此時從int(沒有帶L的整型字面值為int)到byte/short/char也是自動完成的,雖然它們都比int小。在自動類型轉化中,除了以下幾種情況可能會導致精度損失以外,其他的轉換都不能出現精度丟失。
> int --> float
> long--> float
> long--> double
> float-->double without strictfp
除了可能的精度值損失外,自動轉化不會出現任何運行時(run-time)異常
2、強制轉換
如果要把大的轉成小的,或者在short與char之間進行轉換,就必須強制轉換,也被稱作縮小轉換,因為必須顯示地數值更小以適應目標類型。強制轉換采用轉換操作符()。嚴格地說, 將byte轉為char不屬於narrowing conversion) ,因為從byte到char的過程其實是byte-->int-->char,所以widening和narrowing都有。強制轉換除了可能的精度損失外,還可能使模發生變化。強制轉換格式如下:
(target-type) value;
如果整數的值超出了type所能表示的范圍,結果將對byte類型的范圍取余數。例如a=256超出了byte的[-128,127]的范圍,所以將257除以byte的范圍(256)取余數得到b=1;需要注意的是,當a=200時,此時除了256取余數應該為-56,而不是200.
將浮點類型賦給整數類型的時候,會發生截尾,也就是把小數的部分去掉。此時如果整數超出目標類型范圍,一樣將對目標類型的范圍取余數。
不同類型的變量在相互賦值時,什么情況下需要進行強制類型轉換?
范圍大的->范圍小、長->短、子類—>父類
-
賦值及表達式中的類型轉換
字面值賦值
在使用字面值對整數賦值的過程中,可以將int litera賦值給byte short char int,只要不超出范圍。這個過程的類型轉換時自動完成的,但是如果你試圖將long litera賦給byte,即使沒有超出范圍,也必須進行強制類型轉換。
表達式中的自動類型提升
除了賦值以外,表達式計算過程中也可能發生一些類型轉換。在表達式中,類型提升規則如下:
所有byte/short/char都被提升為int。
如果有一個操作數為long,整個表達式提升為long。float和double情況也一樣 -
擴展知識點
Java是面向對象語言,其概念為一切皆為對象,但基本數據類型算是個例外哦,基本數據類型大多是面向機器底層的類型,它是 “值” 而不是一個對象,它存放於“棧”中而不是存放於“堆”中,但Java一切皆為對象的概念不是說說而已,它為每一個基本數據類型都做了相應的包裝類,包裝類就是一個對象,它存放於“堆”中。
在棧中可以直接分配內存的數據是基本數據類型。
引用數據類型:是數據的引用在棧中,但是他的對象在堆中。
java中默認的整數類型是int類型,如果要定義為float型,則要在數值后加上l或L;
默認的浮點型也是雙精度浮點,如果要定義為float型,則要在數值后加上f或F。
一個英文字母或一個阿拉伯數字就是一個字符,占用一個字節
一個漢字就是兩個字符,占用兩個字節。
一個字節等於8位,一個字節等於256個數,就是-128到127一共256。
kB就是kBytes
Bytes就是“字節”的意思!