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,隻是不能超出範圍,如:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
public class Test {
byte b = 50;
byte b1 = 100+1;//java編譯器會自動運算為101,是以視為直接量
byte b2 = b+1; //這個不是直接量,報錯
byte b3 = 255; //超出範圍了,報錯
}
View Code
超出範圍的強轉會丢失精度,因為不同類型所占位元組不同,大類型轉小類型會果斷地把高位砍掉,如:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
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
}
}
強制轉換類型不會涉及到溢出,因為它是直接把高位砍掉,留下的低位一定可以被轉換後的類型表示。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
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。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
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 型,如:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
public static void main(String[] args) {
byte b = 1;
byte b1 = 2;
byte b2 = (byte)(b + b1);
int i = b + b1;
}
如果運作的結果超出了表示範圍,那麼就會溢出,溢出不會報錯。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
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。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
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;
}
}
但十六進制的不能指派為浮點數類型:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
public class Test {
public static void main(String[] args) {
double d = 100.1, d2 = 0100.1;//這一行正常
double d3 = 0x10.1;//這一行報錯
}
}
也可以使用十六進制的另外一種形式指派給它們,但一定要在char 所表示的範圍内。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
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);
}
}
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來模拟。
計算機裡的浮點數是離散的,現實中的浮點數是連續的、無窮的。