Java的數據類型
- 變量就是申請內存來存儲值。也就是說,當創建變量的時候,需要在內存中申請空間。
- 內存管理系統根據變量的類型為變量分配存儲空間,分配的空間只能用來儲存該類型數據。
![]()
因此,通過定義不同類型的變量,可以在內存中儲存整數、小數或者字符。
Java 的兩大數據類型:
- 內置數據類型
- 引用數據類型
內置數據類型
Java語言提供了八種基本類型。六種數字類型(四個整數型,兩個浮點型),一種字符類型,還有一種布爾型。
|| 數據類型 | 字節數|位(bit)| 值范圍 | 包裝類 | 包裝類父類 | 默認值 |
|:--??:--??:--??:--??:--??:--??:--??:--??:--??
| 整形 | byte | 1 | 8bit | [-28-1,28-1-1]即為[-128,127] | java.lang.Byte | java.lang.Number | 0 |
| 整形 | short | 2 | 16bit | [-216-1,216-1-1]即為[-32768,32767] | java.lang.Short | java.lang.Number | 0 |
| 整形 | int | 4 | 32bit | [-232-1,232-1-1] | java.lang.Integer | java.lang.Number | 0 |
| 整形 | long | 8 | 64bit | [-264-1,264-1-1] | java.lang.Long | java.lang.Number | 0L |
| 浮點型 | float | 4 | 32bit | [1.4E-45,3.4028235E38] | java.lang.Float | java.lang.Number | 0.0f |
| 浮點型 | double | 8 | 64bit | [4.9E-324,1.7976931348623157E308] | java.lang.Double | java.lang.Number | 0.0d |
| 布爾型 | boolean | 1 | 8bit | true,false | java.lang.Boolean | java.lang.Object | false |
| 字符型 | char | 2 |16bit | [\u0000, \uffff]轉換10進制[0,65535] | java.lang.Character | java.lang.Object | 'u0000'|
- java八種基本數據類型分為四類八種,四類分別為整型、浮點型、布爾型、字符型;八種分別為byte、short、int、long、float、double、boolean、char;
- java八種基本數據類型的字節數:分別為1、2、4、8個字節;1字節(byte、boolean)、 2字節(short、char)、4字節(int、float)、8字節(long、double);
- 整數的默認類型為int,浮點數的默認類型為double;
- 八種基本數據類型的包裝類:除了char的是Character、int類型的是Integer,其他都是首字母大寫
- 關于值的范圍問題,需要注意char類型是無符號的,不能為負,所以是0開始的;
對于數值類型的基本類型的取值范圍,我們無需強制去記憶,因為它們的值都已經以常量的形式定義在對應的包裝類中了。請看下面的例子:
public class PrimitiveTypeTest {
public static void main(String[] args) {
// 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
Float和Double的最小值和最大值都是以科學記數法的形式輸出的,結尾的"E+數字"表示E之前的數字要乘以10的多少次方。比如3.14E3就是3.14 × 103 =3140,3.14E-3 就是 3.14 x 10-3 =0.00314。
實際上,JAVA中還存在另外一種基本類型 void,它也有對應的包裝類 java.lang.Void,不過我們無法直接對它們進行操作。
Java 各個類型的默認值:
public class Test {
static boolean bool;
static byte by;
static char ch;
static double d;
static float f;
static int i;
static long l;
static short sh;
static String str;
public static void main(String[] args) {
System.out.println("Bool :" + bool);
System.out.println("Byte :" + by);
System.out.println("Character:" + ch);
System.out.println("Double :" + d);
System.out.println("Float :" + f);
System.out.println("Integer :" + i);
System.out.println("Long :" + l);
System.out.println("Short :" + sh);
System.out.println("String :" + str);
}
}
實例輸出結果為:
Bool :false
Byte :0
Character:
Double :0.0
Float :0.0
Integer :0
Long :0
Short :0
String :null
注意:
byte、int、long、和short都可以用十進制、16進制以及8進制的方式來表示。
當使用字面量的時候,前綴 0 表示 8 進制,而前綴 0x 代表 16 進制, 例如:
int decimal = 100;
int octal = 0144;
int hexa = 0x64;
包裝類
- java是一門面向對象的語言,但是8中基本數據類型不具備面向對象的特征,所以實際使用中很不便所以為java八種基本數據類型提供了對應的包裝類。
- 以List為例,大家都知道一個動態數組的add(Object o)方法只能接受一個引用類型,即一個對象,而怎樣把一個數字放到一個動態數組里面?
- 對應包裝類比較特殊的就是int對應的Integer和char對應的Character;
- 對應包裝類的直接父類:前6個由于是數,直接父類為Number,而后兩個的直接父類就是Object類;
自動拆箱與裝箱
簡介:jdk1.5之后的新特性。該特性是編譯器認可的,是在編譯器自動將基本數據類型和包裝類相互轉換,節省了麻煩。
- 自動拆箱 包裝類——>基本數據類型 (原理是調用了xxxValue方法)
- 自動裝箱 基本數據類型——>包裝類 (原理是調用了valueOf方法)
public void d() {
/*自動裝箱:valueOf*/
Integer i=123;//原理是 Integer i=Integer.valueOf(123);
/*自動拆箱*/
int i1=i+1;//原理是 int i1=i.intValue()+1;
Integer a=123;
Integer b=123;
Integer c=a+b;
/*原理為Integer c=Integer.valueOf(a.intValue()+b.intValue());*/
}
引用類型
- 在Java中,引用類型的變量非常類似于C/C++的指針。引用類型指向一個對象,指向對象的變量是引用變量。這些變量在聲明時被指定為一個特定的類型,比如 Employee、Puppy 等。變量一旦聲明后,類型就不能被改變了。
- 對象、數組都是引用數據類型。
- 所有引用類型的默認值都是null。
- 一個引用變量可以用來引用任何與之兼容的類型。
- 例子:Site site = new Site("Runoob")。
Java 常量
常量在程序運行時是不能被修改的。
在 Java 中使用 final 關鍵字來修飾常量,聲明方式和變量類似:
雖然常量名也可以用小寫,但為了便于識別,通常使用大寫字母表示常量。
final double PI = 3.1415927;
自動類型轉換
整型、實型(常量)、字符型數據可以混合運算。運算中,不同類型的數據先轉化為同一類型,然后進行運算。
轉換從低級到高級。
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double

-
不能對boolean類型進行類型轉換。
-
不能把對象類型轉換成不相關類的對象。
-
在把容量大的類型轉換為容量小的類型時必須使用強制類型轉換。
-
轉換過程中可能導致溢出或損失精度,例如:
int i =128;
byte b = (byte)i;
因為 byte 類型是 8 位,最大值為127,所以當 int 強制轉換為 byte 類型時,值 128 時候就會導致溢出。
- 浮點數到整數的轉換是通過舍棄小數得到,而不是四舍五入,例如:
(int)23.7 == 23;
(int)-45.89f == -45
自動類型轉換
必須滿足轉換前的數據類型的位數要低于轉換后的數據類型,例如: short數據類型的位數為16位,就可以自動轉換位數為32的int類型,同樣float數據類型的位數為32,可以自動轉換為64位的double類型。
public class ZiDongLeiZhuan{
public static void main(String[] args){
char c1='a';//定義一個char類型
int i1 = c1;//char自動類型轉換為int
System.out.println("char自動類型轉換為int后的值等于"+i1);
char c2 = 'A';//定義一個char類型
int i2 = c2+1;//char 類型和 int 類型計算
System.out.println("char類型和int計算后的值等于"+i2);
}
}
運行結果為:
char自動類型轉換為int后的值等于97
char類型和int計算后的值等于66
解析:c1 的值為字符 a ,查 ASCII 碼表可知對應的 int 類型值為 97, A 對應值為 65,所以 i2=65+1=66。
強制類型轉換
- 條件是轉換的數據類型必須是兼容的。
- 格式:(type)value type是要強制類型轉換后的數據類型 實例:
public class QiangZhiZhuanHuan{
public static void main(String[] args){
int i1 = 123;
byte b = (byte)i1;//強制類型轉換為byte
System.out.println("int強制類型轉換為byte后的值等于"+b);
}
}
運行結果:
int強制類型轉換為byte后的值等于123
隱含強制類型轉換
-
整數的默認類型是 int。
-
浮點型不存在這種情況,因為在定義 float 類型時必須在數字后面跟上 F 或者 f。
Integer number too large
public class test {
public static void main(String[] args) {
long b=100000000000;//編譯不通過
}
}
Error:(11, 16) java: 過大的整數: 100000000000
+=的情況
public static void main(String[] args) {
short a=1; //第一行
a=a+1; //第二行
a+=1; //第三行
}
/*第幾行的代碼會出錯?
答案:第二行會出錯,由于a+1變為了int類型,而int類型不能直接賦值給short類型
但是+=這種情況是特殊的,所以不會出錯;
*/

浙公網安備 33010602011771號