- Java程序設計與實踐教程(第2版)
- 楊麗萍 王薇 張焱焱主編 北京云班科技有限公司副主編
- 2601字
- 2019-07-01 11:10:50
2.4 數據類型
2.4.1 基本數據類型
在Java編程語言中,主要有兩種類型的數據:基本類型和引用類型。引用類型是一組基本類型的組合,如數組、類和接口。數組型變量本身不存儲實際的值,而是代表了指向內存存放實際數據的位置,這與基本類型有很大差別。
另外,還有一種null類型,沒有名字,因此不能聲明null類型的變量,它通常被表達式描述成空類型。
基本數據類型是Java編程語言預先定義的、長度固定的、不能再分的類型,數據類型的名字被當作關鍵字保留。
Java有8個基本類型(primitive type),其中6個是數值類型(4個整數類型和2個浮點數類型),還有一個是字符類型(char),用來表示Unicode編碼字符;另一個是布爾類型(boolean),用來表示邏輯真true和邏輯假false。Java的基本數據類型如表2-2所示。
表2-2 Java的基本數據類型

1.整數類型
整數類型的表現方式有八進制、十進制、十六進制。八進制數通常用來進行位操作。這3種表現形式如下所示:
· 八進制數如0647、0234等。
· 十進制數如45、769、1236等。
· 十六進制數如0x23f、0x45a、0x45、0xff41等。
由上面的例子可以看出:八進制表示法是在八進制數值前面加0;十進制表示法與一般十進制數的寫法相同;十六進制的表示法是在十六進制數值前面加0x或0X。
Java語言聲明變量的語法格式與C/C++相同,例如:
byte bIntege r =3; short sInteger=128; int money=0xff; long CardID=07788;
int整型數據占有32位的存儲空間,即4個字節。假如由于某些原因必須表示一個更大的數,64位的長整型應該是足夠的。
2.浮點類型
浮點數據用來表示一個帶小數的十進制數,例如11.8或9.7。浮點數主要由如下幾部分組成:十進制整數、小數點、十進制小數、指數和正負符號。浮點數可用標準形式表示,也可用科學記數法形式表示,例如3.14159、1.1、6.22436、3.766E8等。
知識提示 用科學記數法的形式表示浮點數時,指數必須是整數形式。
Java有兩種浮點數形式,即單精度浮點數和雙精度浮點數。單精度浮點數的存儲空間為32位,也就是4個字節;雙精度浮點數的存儲空間為64位。Java通過在浮點數后面加描述符的方法來指明這兩種浮點數。
單精度浮點數如1.5或1.5f或1.5F。
雙精度浮點數如1.5d或1.5D。
如果一個浮點數沒有特別指明后綴,則為雙精度浮點數。
【例2-8】 用雙精度浮點型變量計算一個圓的面積。
//文件名:Area.java public class Area { public static void main(String args[]) { double pi, r, a; r=10.8; //radius of circle pi=3.1416; //pi, approximately a=pi*r*r; //compute area System.out.println("Area of circle is"+a); } }
3.布爾類型
布爾類型只有兩種值:真和假,通常用關鍵字true和false來表示。與C語言和C++語言不同的是,Java的布爾類型只能是真或假,不能代表整數(0或1)。
改變布爾變量可以采用直接賦值的方法,如:myBoolean=true;也可以利用其他變量間接賦值,如:yourBoolean=myBoolean;另外,還可以使用等式賦值,如:myBoolean=2>1。
【例2-9】 布爾類型的使用實例。
//文件名:BoolExample.java public class BoolExample{ public static void main(String args[]) { boolean b; b=false; System.out.println("b is"+b); b=true; System.out.println("b is"+b); //a boolean value can control the if statement if (b){ System.out.println("This is executed."); } b=false; if (b){ System.out.println("This is not executed."); } //outcome of a relational operator is a boolean value System.out.println("10>9 is"+(10>9)); } }
程序的運行結果如下:
b is false b is true This is executed. 10>9 is true.
關于上例需要注意以下3點:
(1)用方法println()輸出布爾值時,顯示的是true或false。
(2)布爾變量本身就足以用來控制if語句,沒有必要將語句寫成像下面這樣:
if (b==true) …
(3)關系表達式的運算結果是布爾值,所以表達式10>9顯示的值是true。此外,在表達式10>9的外側加上圓括號是因為加號“+”運算符的優先級比“>”的優先級要高。
4.字符類型
字符型數據是由一對單引號括起來的單個字符,如’a'、'b'。Java使用的是16位的Unicode字符集。還有一類字符有特殊的意義,被稱為“轉義字符”(escape characters),引用方法為“\”加上特定的字符序列,如表2-3所示。
表2-3 Java的轉義字符

在這里需要指出的是,字符串是用一對雙引號括起來的字符序列,是由String關鍵字所定義的。例如:
String name="Jack"; String passWord="123";
【例2-10】 下面的程序段示范了字符類型和字符串類型的使用區別。
//文件名:CharString.java public class CharString{ public static void main(String args[]){ char ch1, ch2; String name, password; ch1=88; //code for X ch2='Y'; name="Jack"; password="abcd123"; System.out.println("ch1 and ch2:"+ch1+" "+ch2); System.out.println("name and password:"+name+" "+password); } }
程序的運行結果如下:
ch1 and ch2: X Y name and password: Jack abc123
盡管char不是整數,但在許多情況可以對它們進行類似整數的運算操作,如可以將兩個字符相加,或對一個字符變量值進行增量操作。
【例2-11】 字符變量操作實例。
//文件名:CharExample.java public class CharExample{ public static void main(String args[]) { char ch1; ch1 ='X'; System.out.println("ch1 contains "+ch1); ch1 = (char)(ch1+1); //increment ch1 System.out.println("ch1 is now "+ch1); } }
程序的運行結果如下:
ch1 contains X ch1 is now Y
2.4.2 各類型數據間的相互轉換
整型、實型、字符型數據可以混合運算。運算時,不同類型的數據先轉化為同一類型,然后進行運算。按照優先關系,轉換分為兩種:自動類型轉換和強制類型轉換。
1.自動類型轉換
按照優先關系,低級數據要轉換成高級數據時,進行自動類型轉換。轉換規則如表2-4所示。
表2-4 低級數據向高級數據的自動轉換規則

其中,操作數1類型和操作數2類型代表參加運算的兩個操作數的類型,轉換后的類型代表其中一個操作數自動轉換后與另一個操作數達成一致的類型。
【例2-12】 自動類型轉換。
//文件名:AutotypePromot.java public class AutotypePromot{ public static void main(String args[]){ char c='h'; byte b=5; int i=65; long a=465L; float f=5.65f; double d=3.234; int ii=c+i; //char類型的變量c自動轉換為與i一致的int類型參加運算 long aa=a-ii; //int類型的變量ii自動轉換與a一致的long類型參加運算 loat ff=b*f; //byte類型的變量b自動轉換為與f一致的float類型參加運算 double dd=ff/ii+d; //int類型的變量ii自動轉換為與ff一致的float類型 //ff/ii計算結果為float類型,然后再轉換為與d一致的double類型 System.out.println("ii="+ii); System.out.println("aa="+aa); System.out.println("ff="+ff); System.out.println("dd="+dd); } }
程序的運行結果如下:
ii=169 aa=296 ff=28.25 dd=3.401159765958786
2.不兼容強制類型轉換
當進行類型轉換時要注意使目標類型能夠容納原類型的所有信息,允許的轉換包括:
byte→short→int→long→float→double,以及char→int
如上所示,把位于左邊的一種類型的變量賦給位于右邊的類型的變量不會丟失信息。需要說明的是,當執行一個這里并未列出的類型轉換時可能并不總會丟失信息,但進行一個理論上并不安全的轉換總是很危險的。
強制類型轉換只不過是一種顯式的類型變換,它的通用格式如下:
(target_type) value
其中,目標類型(target_type)指定了要將指定值轉換成的類型。例如:
int a; byte b; b=(byte)a ; //把int型變量a強制轉換為byte型
上面的程序段將int型強制轉換成byte型。如果整數的值超出了byte型的取值范圍,那么它的值將會因為對byte型值域取模(整數除以byte得到的余數)而減少。
當把浮點值賦給整數類型時,它的小數部分會被舍去。例如,如果將值1.23賦給一個整數,其結果值只是1,0.23被丟棄了。
【例2-13】 強制類型轉換的例子。
//文件名:Conversion.java public class Conversion{ public static void main(String args[]){ byte b; int i=257; double d=323.142; System.out.println("\nConversion of int to byte."); b=(byte) i; System.out.println("I and b "+i+" "+b); System.out.println("\nConversion of double to int."); i=(int) d; System.out.println("d and I"+d+""+i); System.out.println("\nConversion of double to byte."); b=(byte) d; System.out.println("d and b"+d+" "+b); } }
程序的運行結果如下:
Conversion of int to byte. I and b 257 1 Conversion of double to int. d and I 323.142323 Conversion of double to byte. d and b 323.142 67
讓我們看看每一個類型轉換,當值257被強制轉換為byte變量時,其結果是257除以256(256是byte類型的變化范圍)的余數1。當把變量d轉換為int型,它的小數部分被舍棄了。當把變量d轉換為byte型,它的小數部分被舍掉了,而且它的值減少為256的模,即67。