Java 基本資料型別

Java 基本資料型別

變數就是申請記憶體來儲存值。也就是說,當建立變數的時候,需要在記憶體中申請空間。

記憶體管理系統根據變數的型別為變數分配儲存空間,分配的空間只能用來儲存該型別資料。

因此,通過定義不同型別的變數,可以在記憶體中儲存整數、小數或者字元。

Java 的兩大資料型別:

  • 內建資料型別
  • 引用資料型別

內建資料型別

Java語言提供了八種基本型別。六種數字型別(四個整數型,兩個浮點型),一種字元型別,還有一種布林型。

byte:

  • byte 資料型別是8位、有符號的,以二進位制補碼錶示的整數;
  • 最小值是 -128(-2^7)
  • 最大值是 127(2^7-1)
  • 預設值是 0
  • byte 型別用在大型陣列中節約空間,主要代替整數,因為 byte 變數佔用的空間只有 int 型別的四分之一;
  • 例子:byte a = 100,byte b = -50。

short:

  • short 資料型別是 16 位、有符號的以二進位制補碼錶示的整數
  • 最小值是 -32768(-2^15)
  • 最大值是 32767(2^15 - 1)
  • Short 資料型別也可以像 byte 那樣節省空間。一個short變數是int型變數所佔空間的二分之一;
  • 預設值是 0
  • 例子:short s = 1000,short r = -20000。

int:

  • int 資料型別是32位、有符號的以二進位制補碼錶示的整數;
  • 最小值是 -2,147,483,648(-2^31)
  • 最大值是 2,147,483,647(2^31 - 1)
  • 一般地整型變數預設為 int 型別;
  • 預設值是 0
  • 例子:int a = 100000, int b = -200000。

long:

  • long 資料型別是 64 位、有符號的以二進位制補碼錶示的整數;
  • 最小值是 -9,223,372,036,854,775,808(-2^63)
  • 最大值是 9,223,372,036,854,775,807(2^63 -1)
  • 這種型別主要使用在需要比較大整數的系統上;
  • 預設值是 0L
  • 例子: long a = 100000L,Long b = -200000L。
    "L"理論上不分大小寫,但是若寫成"l"容易與數字"1"混淆,不容易分辯。所以最好大寫。

float:

  • float 資料型別是單精度、32位、符合IEEE 754標準的浮點數;
  • float 在儲存大型浮點陣列的時候可節省記憶體空間;
  • 預設值是 0.0f
  • 浮點數不能用來表示精確的值,如貨幣;
  • 例子:float f1 = 234.5f。

double:

  • double 資料型別是雙精度、64 位、符合 IEEE 754 標準的浮點數;
  • 浮點數的預設型別為 double 型別;
  • double型別同樣不能表示精確的值,如貨幣;
  • 預設值是 0.0d
  • 例子:

    double   d1  = 7D ;
    double   d2  = 7.; 
    double   d3  =  8.0; 
    double   d4  =  8.D; 
    double   d5  =  12.9867; 

    7 是一個 int 字面量,而 7D,7. 和 8.0 是 double 字面量。

boolean:

  • boolean資料型別表示一位的資訊;
  • 只有兩個取值:true 和 false;
  • 這種型別只作為一種標誌來記錄 true/false 情況;
  • 預設值是 false
  • 例子:boolean one = true。

char:

  • char 型別是一個單一的 16 位 Unicode 字元;
  • 最小值是 \u0000(十進位制等效值為 0);
  • 最大值是 \uffff(即為 65535);
  • char 資料型別可以儲存任何字元;
  • 例子:char letter = 'A';。

例項

對於數值型別的基本型別的取值範圍,我們無需強制去記憶,因為它們的值都已經以常量的形式定義在對應的包裝類中了。請看下面的例子:

例項

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=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + Byte.MIN_VALUE); System.out.println("最大值:Byte.MAX_VALUE=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + 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=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + Short.MIN_VALUE); System.out.println("最大值:Short.MAX_VALUE=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + 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=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + Integer.MIN_VALUE); System.out.println("最大值:Integer.MAX_VALUE=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + 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=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + Long.MIN_VALUE); System.out.println("最大值:Long.MAX_VALUE=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + 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=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + Float.MIN_VALUE); System.out.println("最大值:Float.MAX_VALUE=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + 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=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + Double.MIN_VALUE); System.out.println("最大值:Double.MAX_VALUE=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + 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=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + (int) Character.MIN_VALUE); // 以數值形式而不是字元形式將Character.MAX_VALUE輸出到控制檯 System.out.println("最大值:Character.MAX_VALUE=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/" + (int) Character.MAX_VALUE); } }

執行例項 ?

編譯以上程式碼輸出結果如下所示:

基本型別:byte 二進位制位數:8
包裝類:java.lang.Byte
最小值:Byte.MIN_VALUE=https://www.big2gb.com/cn2tw0.php?url=https://www.itread01.com/java/-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 各個型別的預設值:

資料型別 預設值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char 'u0000'
String (or any object) null
boolean false

例項

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

引用型別

  • 在Java中,引用型別的變數非常類似於C/C++的指標。引用型別指向一個物件,指向物件的變數是引用變數。這些變數在宣告時被指定為一個特定的型別,比如 Employee、Puppy 等。變數一旦聲明後,型別就不能被改變了。
  • 物件、陣列都是引用資料型別。
  • 所有引用型別的預設值都是null。
  • 一個引用變數可以用來引用任何與之相容的型別。
  • 例子:Site site = new Site("itread01")。

Java 常量

常量在程式執行時是不能被修改的。

在 Java 中使用 final 關鍵字來修飾常量,宣告方式和變數類似:

final double PI = 3.1415927;

雖然常量名也可以用小寫,但為了便於識別,通常使用大寫字母表示常量。

字面量可以賦給任何內建型別的變數。例如:

byte a = 68;
char a = 'A'

byte、int、long、和short都可以用十進位制、16進位制以及8進位制的方式來表示。

當使用字面量的時候,字首 0 表示 8 進位制,而字首 0x 代表 16 進位制, 例如:

int decimal = 100;
int octal = 0144;
int hexa =  0x64;

和其他語言一樣,Java的字串常量也是包含在兩個引號之間的字元序列。下面是字串型字面量的例子:

"Hello World"
"two\nlines"
"\"This is in quotes\""

字串常量和字元常量都可以包含任何Unicode字元。例如:

char a = '\u0001';
String a = "\u0001";

Java語言支援一些特殊的轉義字元序列。

符號 字元含義
\n 換行 (0x0a)
\r 回車 (0x0d)
\f 換頁符(0x0c)
\b 退格 (0x08)
\0 空字元 (0x0)
\s 空格 (0x20)
\t 製表符
\" 雙引號
\' 單引號
\\ 反斜槓
\ddd 八進位制字元 (ddd)
\uxxxx 16進位制Unicode字元 (xxxx)

自動型別轉換

整型、實型(常量)、字元型資料可以混合運算。運算中,不同型別的資料先轉化為同一型別,然後進行運算。

轉換從低階到高階。

低  ------------------------------------>  高

byte,short,char—> int —> long—> float —> double 

資料型別轉換必須滿足如下規則:

  • 1. 不能對boolean型別進行型別轉換。

  • 2. 不能把物件型別轉換成不相關類的物件。

  • 3. 在把容量大的型別轉換為容量小的型別時必須使用強制型別轉換。

  • 4. 轉換過程中可能導致溢位或損失精度,例如:

    int i =128;   
    byte b = (byte)i;
    

    因為 byte 型別是 8 位,最大值為127,所以當 int 強制轉換為 byte 型別時,值 128 時候就會導致溢位。

  • 5. 浮點數到整數的轉換是通過捨棄小數得到,而不是四捨五入,例如:

    (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

強制型別轉換

  • 1. 條件是轉換的資料型別必須是相容的。

  • 2. 格式:(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
    

隱含強制型別轉換

  • 1. 整數的預設型別是 int。

  • 2. 浮點型不存在這種情況,因為在定義 float 型別時必須在數字後面跟上 F 或者 f。

這一節講解了 Java 的基本資料型別。下一節將探討不同的變數型別以及它們的用法。