Java 是強類型語言, 所以在源代碼編譯時,聲明的變量時必須明確它所屬類型.
基本數據類型 引用數據類型
byte 對應的包裝類→ Byte
short 對應的包裝類→ Short
int 對應的包裝類→ Integer
long 對應的包裝類→ Long
char 對應的包裝類→ Character
float 對應的包裝類→ Float
double 對應的包裝類→ Double
boolean 對應的包裝類→ Boolean
interface 接口
Array 數組
基本數據類型中,除了char ,boolean以外, 其他的都可以font用來表示數字.
區別如下:
byte 範圍 -128 ~ 128
short 範圍 -2的15次方 ~ 2的15次方-1
int 範圍 -2的31次方 ~ 2的31次方-1
long 範圍 -2的63次方 ~ 2的63次方-1
float 範圍 -2的-149次方 ~ 2的128次方-1
double 範圍 -2的-1074次方 ~ 2的1024次方-1
特殊的是char類型, 例如 char a = 1; a 表示的是 UCS-2 編碼爲 1 的字符,直接打印 a 是亂碼
在Java中不支持使用char類型,UCS-2 遠遠少於Unicode字符的數量,在跟一些數據庫的char類型數據結合進行的特殊查詢的情況下,會出現問題.
字節和字符
字節: 硬盤或內存中存儲形式.1個字節代表 8位的二進制數(bit).比如:1 byte = 0110 1010
字符: 佔用字節數根據不同的字符集確定
字符集
Unicode 字符集
Java默認採用的就是這個字符集,
常用編碼方法 UTF-8(Unicode Tranformation Format),萬國碼
一個字節代表一個英語字符,三個字節表示一個漢語字符,特殊漢語字符4個字節
GBK 字符集
英語字符佔一個字節,漢語字符佔兩個字符
包括中日韓字符的大字符集合,支持中文簡體和繁體
GB2312 字符集
英語字符佔一個字節,漢語字符佔兩個字符
GBK子集,中國國家標準的簡體中文字符集, 不支持繁體字符的編碼.
一般用於中國大陸和新加坡
ASCII 字符集
基於羅馬字母表的一套電腦編碼系統,一個英語字符由佔一個字節,
漢語字符佔兩個字節
數據類型的轉換
自動轉換
小範圍的數據類型到大範圍的數據類型會自動轉換類型
小----------------------------------------------大
byte - short - int - long - float - double
byte a = 1; byte b = 2; byte c = a + b;//編譯失敗,需要強制類型轉換成int類型 int c = a + b;//編譯通過
強制轉換
基本數據類型之間
public byte cout(byte b1, byte b2) { return (byte) (b1 / b2); //需要強制類型轉換 }
大範圍類型到小範圍類型強制轉換會損失精度
double d = 3.14; int i = (int) d; System.out.println(i);//打印結果 i = 3
引用數據類型之間
通常是在存在繼承關係的父子類中的強制轉換
public class Father { public void print() { System.out.println("Father Print"); } } public class Son extends Father { public void print() { System.out.println("Son Print"); } public void other() { System.out.println("son"); } }
Son的內容要比Father豐富,也可以說Son的範圍比Father大,所以:
Father father = new Son();//將大範圍的內容交給小範圍的實例
所以father實例雖然指向的是Son內容,但是能力被削弱了,它不能訪問Son中獨有的部分
父類對象強制轉換成子類類型
Son son = (Son) father;//把father對象強化回Son對象,功能恢復
但是:
Father father = new Father(); Son son = (Son) father;//拋出異常:java.lang.ClassCastException轉換異常
總得來說:子類可以自動轉型爲父類,但是父類強制轉換爲子類時只有當引用類型真正的身份爲子類時纔會強制轉換成功,否則失敗.
在強制轉換之前必須保證前提是:功能較弱的類型引用的一個功能較強的對象時,使用強制轉換來恢復功能,反之失敗.所以,良好的編碼習慣是轉換之前使用方法 instanceof 方法判斷一下:
if (father instanceof Son) { Son son = (Son) father;//判斷爲true 則執行轉換 }