書名: Java從入門到精通(第2版)作者名: 龍馬高新教育策劃 魔樂科技(MLDN)軟件實訓中心編著 張玉宏主編本章字數: 832字更新時間: 2019-01-02 04:58:50
第5章 不可不知的數據分類法—數據類型
本章視頻教學錄像:1 小時46分鐘
Java的數據類型在程序語言的構成要素里占有相當重要的地位。Java的數據類型可分為基本數據類型與引用數據類型兩大類。本章介紹Java的基本數據類型和數據類型的轉換,其中重點講述整型、浮點類型、字符類型和布爾類型。最后對基本數據類型的默認值進行討論。
本章要點(已掌握的在方框中打鉤)
□ 掌握整數類型的分類
□ 掌握浮點數據類型的分類
□ 掌握字符類型數據
□ 掌握布爾類型數據
□ 熟悉基本數據類型默認值的意義與使用方法
5.1 數據類型的意義
本節(jié)視頻教學錄像:41分鐘
為什么要有數據類型?在回答這個問題之前,我們先溫習下先賢孔子在《論語·陽貨》里的一句話:“子之武城,聞弦歌之聲。夫子莞爾而笑,曰:‘割雞焉用牛刀。’”
據此,衍生了中國一個著名的成語——“殺雞焉用宰牛刀”?這是疑問句式。是的,殺雞的刀用來殺雞,宰牛的刀用來宰牛,用宰牛的刀殺雞,豈不大材小用?
殺雞的刀和宰牛的刀雖然都是刀,但屬于不同的類型,如果二者混用,要么出現“大材小用”,要么出現“不堪使用”的情況。由此,可以看出,正是有了類型的區(qū)分,我們才可以根據不同的類型,確定其不同的功能,然后“各司其職”,不出差錯。

除了不同類型的“刀”承擔的功能不一樣,而且如果我們給“殺雞刀”和“宰牛刀”各配一個刀套,刀套的大小也自然是不同的。“殺雞刀”放到“宰牛刀”的刀套里,勢必空間浪費,而“宰牛刀”“放到殺雞刀”的刀套里,勢必放不下。在必要時,“宰牛刀”“經過打磨,可以做成“殺雞刀”。
從哲學上來看,很多事物的表象千變萬化,而其本質卻是相同。類似的,在Java語言中,每個變量(常量)都有其數據類型。不同的數據類型可允許的操作也是不同的。比如,對于整型數據,它們只能進行加減乘除和求余操作。此外,不同的數據占據的內存空間大小也是不盡相同的。而在必要時,不同的數據類型也是可以做到強制類型轉換的。
程序,本質上就是針對數據的一種處理流程。那么,針對程序所能夠處理的數據,就是程序語言的各個數據類型劃分。正是有了各種數據類型,程序才可以“有的放矢”進行各種不同數據操作。
在Java之中數據類型一共分為兩大類:基本數據類型、引用數據類型。由于引用數據類型較為難理解,所以針對于此部分的內容,本章暫不作討論,本章討論的是基本數據類型。在Java中規(guī)定了8種基本數據類型變量來存儲整數、浮點數、字符和布爾值,如下圖所示。

一個變量就如同一個杯子或一個容器,在其內要裝載某個特定的數值(如同杯子里可盛水或咖啡等)。杯子有大有小,杯子里裝的水(咖啡)也有多有少。同樣,不同類型的變量,其能表示的數據范圍也是不同的。Java的基本數據類型占用內存位數及可表示的數據范圍如下表所示。

5.2 整數類型
本節(jié)視頻教學錄像:20分鐘
整數類型(Integer),簡稱整型,表示的是不帶有小數點的數字。例如,數字10、20就表示一個整型數據。在Java中,有4種不同類型的整型,按照占據空間大小的遞增次序,分別為byte(位)、short(短整型)、int(整數)及l(fā)ong(長整數)。在默認情況下,整數類型是指int型,那么下面先通過代碼來觀察一下。
舉例來說,想聲明一個短整型變量sum時,可以在程序中做出如下的聲明。
short sum; //聲明sum為短整型
經過聲明之后,Java即會在可使用的內存空間中,尋找一個占有2個字節(jié)的塊供sum變量使用,同時這個變量的范圍只能在-32768 到 32767之間。
5.2.1 byte類型
在Java中,byte類型占據1字節(jié)內存空間,數據的取值范圍為-128 ~ 127。
【范例5-1】 byte類型數據的使用(代碼bytedemo.java)。
01 public class bytedemo
02 { 03 public static void main(String args[]) 04 { 05 byte byte_max=Byte.MAX_VALUE;//得到Byte型的最大值 06 07 System.out.println("BYTE的最大值:"+byte_max); 08 } 09 }
【運行結果】
程序運行結果如下圖所示。
【范例分析】

每種基本的數據類型都有幾個靜態(tài)屬性,如MAX_VALUE(最大值)、MIN_VALUE(最小值)、SIZE(大小)、TYPE(類型)等。要得到這些值,可用名稱為該類型首字母大小對象(如byte類型對應Byte對象)通過點(.)操作符將其讀取出來,參見代碼05行。Byte 類將基本類型 byte 的值包裝在一個對象中。一個 Byte 類型的對象只包含一個類型為 byte 的字段。Byte類常見的靜態(tài)屬性如下表所示。
屬性名稱
MAX VALUE
MIN VALUE
SIZE
TYPE
屬性值
最大值:27-1=127
最小值:-27=-128
所占的內存位數(bit):8位
數據類型:byte
5.2.2 short類型
short類型數據占據2個字節(jié)內存空間,取值范圍為-32768 ~ 32767。
【范例5-2】 short類型數據的使用(代碼shortdemo.java)。
01 public class shortdemo 02 { 03 public static void main(String args[])
04 { 05 short short_max=Short.MAX_VALUE; //得到短整型的最大值 06 07 System.out.println("SHORT的最大值:"+short_max); 08 09 } 10 }
【運行結果】
程序運行結果如下圖所示。

【范例分析】
代碼05行的功能就是獲得短整數所能表達的最大數值(Short.MAX_VALUE)。
5.2.3 int類型
int類型數據占據4個字節(jié)內存空間,取值范圍為-2147483648 ~ 2147483647。
【范例5-3】 int類型數據的使用(intdemo.java)。
01 public class intdemo 02 { 03 public static void main(String args[]) 04 { 05 int int_max= java.lang.Integer.MAX_VALUE ; //得到整型的最大值 06 //int int_max= Integer.MAX_VALUE ; //與上一句功能相同 07 System.out.println("INT的最大值:"+int_max); 08 09 } 10 }
【運行結果】
程序運行結果如下圖所示。

【范例分析】
代碼05行的功能就是獲得短整型所能表達的最大數值(Integer.MAX_VALUE)。由于java.lang包是Java語言默認加載的,所以第05行的語句可以簡化為被注釋的第06行。lang是language(語言)的簡寫。范例【5-1】和范例【5-2】使用的就是這種簡寫模式。
由于每一種類型畢竟都有其對應范圍的最大或最小值,那么如果說在計算的過程之中,超過了此范圍(大于最大值或小于最小值),那么就會產生數據的溢出問題。請參見如下的范例,整型數據的溢出(ShotDemo2.java)。
01 public class ShotDemo2 02 { 03 public static void main(String args[]) 04 { 05 int max=Integer.MAX_VALUE; //取得int的最大值 06 int min=Integer.MIN_VALUE; //取得int的最小值 07 System.out.println(max); //最大值:2147483647 08 System.out.println(min); //最小值:-2147483648 09 System.out.println(max+1); //得到最小值:-2147483648 10 System.out.println(max+2); //相當于最小值+1:-2147483647 11 System.out.println(min-1); //得到最大值:2147483647 12 } 13 }
【運行結果】
運行結果如下圖所示。

【范例分析】
第07、08行分別輸出int類型的最大值和最小值。那么比int類型的最大值還大1是什么值?比int類型的最小值還小1的是什么值?第09行和第11行分別給出了答案,比int類型的最大值還大1是最小值,而int類型的最小值還小1的是最大值。這里的最大值、最小值的轉換是不是有點中國哲學里“物極必反,否極泰來”的味道呢?悟到這個道理,讀者朋友才能找出實戰(zhàn)練習(5.9節(jié)中)第2題中的錯誤。數據最大值、最小值會出現一個循環(huán)過程,這種情況就稱為數據溢出(overflow)。
5.2.4 long類型
long類型數據占據8個字節(jié)內存空間,取值范圍為-9223372036854775808 ~ 9223372036854775807。
【范例5-4】 long類型數據的使用(LongDemo.java)。
01 public class LongDemo 02 { 03 public static void main(String args[]) 04 { 05 long long_max=java.lang.Long.MAX_VALUE; //得到長整型的最大值 06 System.out.println("LONG的最大值:"+long_max); 07 } 08 }
【運行結果】
程序運行結果如下圖所示。

【范例分析】
范例第05行定義長整型long_max,并將系統(tǒng)定義好的java.lang.Long.MAX_VALUE賦給這個變量。第07行輸出這個值。
在范例【5-4】中,我們演示了整型數據的數據溢出問題,而要想解決數據的溢出問題,那么最好的做法是擴大數據的操作范圍,比int范圍大的是剛剛講到的long類型,所以可將其擴充為long,有兩種方式擴充。
⑴ 直接在數據前增加一個“(long)”;
⑵ 直接在數據后增加一個字母“L”。
具體用法參見【范例5-5】所示。
【范例5-5】 使用long類型解決int類型溢出問題(LongDemo.java)。
01 public class intOverflowToLong 02 {
03 public static void main(String args[]) 04 { 05 int max=Integer.MAX_VALUE; //取得int的最大值 06 int min=Integer.MIN_VALUE; //取得int的最小值 07 System.out.println(max); //最大值:2147483647 08 System.out.println(min); //最小值:-2147483648 09 System.out.println(max+(long)1); //int型+long型=long型,2147483648 10 System.out.println(max+2L); //int型+long型=long型,2147483649 11 System.out.println(min-1L); //int型-long型=long型,-2147483649 12 } 13 }
【運行結果】
運行結果如下圖所示。

【范例分析】
第09行,數字1前面的long表示把1強制轉換為長整型(默認情況下1為普通整型int),為了不丟失數據的精度,低字節(jié)類型數據與高字節(jié)數據運算,其結果自動轉變?yōu)楦咦止?jié)數據,因此,int型與long型運算的結果是 long型數據。
第10行和第11行,整型數據2和1后的字母“L”也達到把2和1轉變?yōu)殚L整型的效果。
請讀者對照對比體會范例【5-4】和范例【5-5】的區(qū)別。類型轉換的知識將在5.6節(jié)詳述。
5.3 浮點類型
本節(jié)視頻教學錄像:10分鐘
Java浮點數據類型主要有雙精度double和單精度float兩個類型。
double類型:共8個字節(jié),64位,第1位為符號位,中間11位表示指數,最后52位為尾數。float類型:共4個字節(jié),32位,第1位為符號位,中間8位表示指數,最后23位表示尾數。
5.3.1 float類型
下面舉一個簡單的例子。在程序中,聲明一個float類型的變量num,并賦值為3.0,將num*num的運算結構輸出到顯示器上。
【范例5-6】 浮點類型的使用(floatDemo.java)。
01 //下面這段程序說明了浮點數類型的使用方法 02 public class floatDemo 03 { 04 public static void main(String args[]) 05 { 06 float num=3.0f; 07 System.out.println(num+"*"+num+"="+(num*num)); 08 } 09 }
【運行結果】
程序運行結果如下圖所示。

【范例分析】
需要注意一點,含小數的實數默認為double類型數據,如果定義的是float型數據,為其賦值的時候,必須要執(zhí)行強制轉型,有兩種方式。
⑴ 直接加上字母“F”,或小寫字母“f”,例如:“float data = 1.2F ;”或“float data = 1.2f”。
⑵ 直接在數字前加強制轉型為“float”,例如:“float data2 = (float) 1.2 ;”。
范例中06行定義了一個float類型變量num,并賦值為3.0f。其中3.0后的字母“f”其實就是上面講到的第一種強制類型轉換。07行將num做了簡單的乘法運算輸出。
5.3.2 double類型
當浮點數的表示范圍不夠大的時候,還有一種雙精度(double)浮點數可供使用。雙精度浮點數類型的長度為64個字節(jié),有效范圍為-1.7×10308~1.7×10308。
Java提供了浮點數類型的最大值與最小值的代碼,其所使用的類全名與所代表的值的范圍,可以在下表中查閱。

類似的,在類全名中,可以省去類庫java.lang,直接取用類名稱即可。下面的程序是輸出float與double兩種浮點數類型的最大與最小值,讀者可以將下面程序的輸出結果與上表一一進行比較。
【范例5-7】 取得單精度和雙精度浮點數類型的最大、最小值(doubleAndFloatDemo. java)。
01 //下面這段程序用于取得單精度和雙精度浮點數類型的最大、最小值 02 public class doubleAndFloatDemo 03 { 04 public static void main(String args[]) 05 { 06 System.out.println("float_max="+java.lang.Float.MAX_VALUE); 07 System.out.println("float_min="+java.lang.Float.MIN_VALUE); 08 System.out.println("double_max="+java.lang.Double.MAX_VALUE); 09 System.out.println("double_min="+java.lang.Double.MIN_VALUE); 10 } 11 }
【運行結果】
程序運行結果如下圖所示。

下面為聲明與設置float與double類型的變量時應注意的事項。
double num1=-6.3e64; //聲明num1為double,其值為-6.3*10^64 double num2=-5.34E16; //e也可以用大寫的E來取代
float num3=7.32f; //聲明num3為float,并設初值為7.32f float num4=2.456E67; //錯誤,因為2.456*1067已超過float可表示的范圍
5.4 字符類型(char)
本節(jié)視頻教學錄像:11分鐘
字符,顧名思義,就是字母和符號的統(tǒng)稱。字符類型在內存中占有2個字節(jié),定義時語法為。
char a=‘字’; //聲明a為字符型,并賦初值為‘字’
下面給出一個范例來說明它的用法。
【范例5-8】 直接給字符類型賦值(charDemo.java)。
01 //字符類型也可以直接賦給數值,下面的這段程序就是采用這種賦值方式 02 public class charDemo 03 { 04 public static void main(String args[]) 05 { 06 char ch1=97; 07 char ch2='a'; 08 System.out.println("ch1="+ch1); 09 System.out.println("ch2="+ch2); 10 } 11 }
【運行結果】
程序運行結果如下圖所示。

需要注意的是:字符要用一對單引號(' ')括起。但如果把一個字符變量賦值成一個單引號,就會出問題,這樣就有了轉義字符的概念。轉義字符就是用不容易混淆的字符來代替那些敏感字符,它們作為一個整體使用。
下表為常用的轉義字符。

以下面的程序為例,將ch賦值為'\"'(要以單引號(')包圍),并將字符變量ch輸出在顯示器上,同時在打印的字符串里直接加入轉義字符,讀者可自行比較一下兩種方式的差異。
【范例5-9】 轉義字符的使用(EscapeChar.java)。
01 //下面這段程序表明了轉義字符的使用方法 02 public class EscapeChar 03 { 04 public static void main(String args[]) 05 { 06 char ch='\"'; 07 System.out.println(ch+"測試轉義字符!"+ch); 08 System.out.println("\"hello world!\""); 09 } 10 }
【運行結果】
程序運行結果如下圖所示。

總結可以得知,不管是用變量存放轉義字符,還是直接使用轉義字符的方式來輸出字符串,程序都可以順利運行。由于使用變量會占用內存資源,因此似乎顯得有些不妥;當然也可以不必聲明字符變量就輸出轉義字符,但如果在程序中加上太多的轉義字符,以至于造成混淆而不易閱讀時,利用聲明字符變量的方式就是一個不錯的選擇。
但是需要注意的是,Java之中默認采用的編碼方式為Unicode編碼,此編碼是一種采用十六進制編碼方案,可以表示出世界上的任意的文字信息。所以在Java之中單個字符里面是可以保存中文字符的,一個中文字符占據2個字節(jié)。這點是與C/C++對字符型的處理是有區(qū)別的,在C/C++中,中文字符只能當作字符串處理。
【范例5-10】 單個中文字符的使用(ChineseChar.java)。
01 public class ChineseChar 02 { 03 public static void main(String args[]) 04 { 05 char c='中';//單個字符變量c,存儲單個中文字母 06 System.out.println(c); 07 } 08 }
【運行結果】
程序運行結果如下圖所示。

值得注意的是,char和int型數據的互相轉型問題。遵循C語言常用的ASCII碼的習慣,字母的表示范圍是:大寫字母A~Z對應整數65 ~ 90、小寫字母a~z對應整數97 ~ 122、字符0~9對應整型數49 ~ 57,由此可以發(fā)現,大寫字母和小寫字母之間的差是32個長度,如果按照此規(guī)律,就可以輕易的編寫一個大小寫的轉換操作。參見范例5-12所示。
提示
ASCII(American Standard Code for Information Interchange,美國標準信息交換碼)是計算機中用得最廣泛的字符集及其編碼,由美國國家標準局(ANSI)制定,已被國際標準化組織(ISO)定為國際標準。
【范例5-11】 單個英文字符與ASCII(整型值)的轉換(CharToInt.java)。
01 public class CharToInt 02 { 03 04 public static void main(String args[]) 05 { 06 char c='A'; 07 int x=c; //字符c直接給整型變量賦值 08 System.out.println(x); //輸出字符A的ASCII碼值:65 09 x=x+32; //編碼值提升32 10 c=(char)x; //將數字的編碼值變?yōu)樽址担篴 11 System.out.println(c); 12 13 } 14 }
【運行結果】
程序運行結果如下圖所示。

【范例分析】
范例07行,字符c直接給整型變量賦值x,此時x的值就是c對應的ASCII碼值,也就是65,第08行輸出這個結果。
范例第09行,整型變量x值增加32,也就是97,此值正是小寫字母‘a’的ASCII值。第10行將x強制類型轉換為字符型,第11行輸出該字符‘a’。
5.5 布爾類型(boolean)
本節(jié)視頻教學錄像:3分鐘
布爾(Boolean)本是一位英國數學家的名字。在Java中使用關鍵字boolean來聲明布爾類型。被聲明為布爾類型的變量,只有true(真)和false(假)兩種。除此之外,沒有其他的值可以賦值給這個變量。
布爾類型主要用于邏輯判斷,就如我們日常生活中的“真”和“假”一樣。比如,我們可以用布爾類型來表示某人的性別,“張三”是否是“男人”?如下圖所示。

若想聲明名稱為Zhang3IsMan的變量為布爾類型,并設置為true值,可以使用下面的語句。
boolean Zhang3IsMan=true; //聲明布爾變量Zhang3IsMan,并賦值為true
經過聲明之后,布爾變量的初值即為true,當然如果在程序中需要更改status的值時,即可隨時更改。將上述的內容寫成了程序booleanDemo,讀者可以先熟悉一下布爾變量的使用。
【范例5-12】 布爾值類型變量的聲明(booleanDemo.java)。
01 //下面的程序聲明了一個布爾值類型的變量 02 public class booleanDemo 03 { 04 public static void main(String args[])
05 { 06 //聲明一布爾型的變量status,布爾型只有兩個取值:true、false 07 boolean Zhang3IsMan=true; 08 System.out.println("Zhang3 is man?="+Zhang3IsMan); 09 } 10 }
【運行結果】
程序運行結果如下圖所示。

【范例分析】
第07行定義一個布爾變量Zhang3IsMan,并賦值為true。第08行輸出這個判斷。
特別注意的是,Zhang3IsMan不能賦值為0或者1,或者其他整數,編譯器將不予通過。
布爾值通常用來控制程序的流程,讀者可能會覺得有些抽象,本書會陸續(xù)在后面的章節(jié)中介紹布爾值在程序流程中所起的作用。
5.6 數據類型的轉換
本節(jié)視頻教學錄像:36分鐘
Java有嚴格的數據類型限制,每種數據類型都有其獨特的特性。這些不同的數據類型所定義的變量,它們之間的類型轉換不是輕易完成的。但在特殊情況下,還是需要進行類型轉換的操作,但必須遵循嚴格的步驟和規(guī)定。數據類型的轉換方式可分為“自動類型轉換”及“強制類型轉換”兩種。下面分別給予討論。
5.6.1 自動類型轉換
在程序中已定義好了數據類型的變量,若想轉換用另一種數據類型表示時,Java會在下面2個條件皆成立時,自動進行數據類型的轉換。
⑴ 轉換前后的數據類型要相互兼容。在C/C++中,整型和布爾類型的關系是 “非零即為真”——凡是不是零的整數都可以認為是布爾值為真變量,二者是兼容的,所以可以相互轉換。而在Java中,由于boolean類型只能存放true或flase,與整數及字符不兼容,因此boolean類型不可能與其他任何數據類型進行轉換。整數與浮點數亦是兼容的,所以可相互轉換。
⑵ 轉換后的數據類型的表示范圍不小于轉換前的類型。以“擴大轉換”來看可能比較容易理解。Java在進行數值運算時,以盡量不損失精度(正確性)為準則。例如,一個字符型的變量(本質上是2字節(jié)大小的整數)和一個整型變量(默認為4個字節(jié)大小整數)進行計算,在運算前,不同類型的操作數需要先轉化為同一數據類型,然后再實施運算操作。因此需要將字符型的變量轉換為整型變量,否則將4字節(jié)整型變量轉換為2字節(jié)的字符型,很有可能導致整型變量的值會溢出,從而導致計算錯誤。字符與整數是可使用自動類型轉換的。
假設參與某種運算有兩個不同的操作數(操作數1和操作數2),二者具有不同的數據類型,在運算操作之前,它們需要轉換為同一數據類型,其相互轉換的規(guī)則如下表所示。

在接下來的范例中,我們來看看當兩個數中有一個為浮點數時,其運算的結果會有什么樣的變化。
【范例5-13】 聲明兩個變量,一個是整型,另一個是浮點型(IntAndFloat. java)。
01 //下面這段程序聲明了兩個變量,一個是整型,另一個是浮點型 02 public class IntAndFloat 03 { 04 public static void main(String args[]) 05 { 06 int a=156; 07 float b=24.1f; //聲明一浮點型變量f,并賦值24.1 08 System.out.println("a="+a+",b="+b); 09 System.out.println("a/b="+(a/b)); //在這里整型會自動轉換為浮點型 10 } 11 }
【運行結果】
程序運行結果如下圖所示。

【范例分析】
從運行的結果可以看出,當兩個數中有一個為浮點數時(代碼第10行),其運算的結果會直接轉換為浮點數。當表達式中變量的類型不同時,Java會自動把較小的表示范圍轉換成較大的表示范圍后,再做運算。也就是說,假設有一個整數和雙精度浮點數作運算,Java會把整數轉換成雙精度浮點數后再做運算,運算結果也會變成雙精度浮點數。關于表達式的數據類型轉換,在后面的章節(jié)中會有更詳細的介紹。
現在,我們可以給出自動數據類型轉型的規(guī)律:byte short int long float double,按照范圍由小到大實現自動轉型操作。
5.6.2 強制類型轉換
當程序需要轉換數據類型時,可實施強制性的類型轉換,其語法如下。
(欲轉換的數據類型)變量名稱;
下面的程序說明了在Java里,整數與浮點數是如何轉換的。
【范例5-14】 自動轉換和強制轉換的使用方法(AutoConvert.java)。
01 //下面的范例說明了自動轉換和強制轉換這兩種轉換的使用方法 02 public class AutoConvert 03 { 04 public static void main(String args[]) 05 { 06 int a=55; 07 int b=9; 08 float g,h; 09 System.out.println("a="+a+",b="+b); 10 g=a/b; 11 System.out.println("a/b="+g+"\n"); 12 System.out.println("a="+a+",b="+b); 13 h=(float)a/b; //在這里對數據類型進行強制轉換 14 System.out.println("a/b="+h); 15 } 16 }
【運行結果】
程序運行結果如下圖所示。

當兩個整數相除時,小數點以后的數字會被截斷,使得運算的結果保持為整數。但由于這并不是預期的計算結果,而想要得到運算的結果為浮點數,就必須將兩個整數中的一個(或是兩個)強制轉換為浮點數,下面的3種寫法都正確。
(float)a/b; //將整數a強制轉換成浮點數,再與整數b相除 a/(float)b; //將整數b強制轉換成浮點數,再以整數a除之 (float)a/(/float)b; //將整數a與b同時強制轉換成浮點數,再相除
只要在變量前面加上欲轉換的數據類型,運行時就會自動將此行語句里的變量做類型轉換的處理,但這并不影響原先所定義的數據類型。
此外,若將一個超出該變量可表示范圍的值賦給這個變量,這種轉換稱為縮小轉換。由于在轉換的過程中可能會丟失數據的精確度,因此Java并不會“自動”做這些類型的轉換,此時就必須要做強制性的轉換,例如 int x = (int)10.35(結果x=10),將double類型的值(10.35)強制轉換為int類型(10),這樣也丟失了很多的信息。
5.7 基本數據類型的默認值
本節(jié)視頻教學錄像:10分鐘
在Java中,若在變量的聲明時沒有賦初值,則會給該變量賦默認值。下表列出了各種類型的默認值。

在某些情形下,Java會給予這些沒有賦初始值的變量一個確切的默認值,這個值沒有任何意義,但保證程序執(zhí)行時,不運行有這種沒有初始化值的變量存在。雖然這種方式給程序編寫者帶來了很多便利,但是過于依賴系統(tǒng)給變量賦初值,就不容易檢測到是否已經給予變量應有的值了,這是個需要注意的問題。
5.8 高手點撥
本節(jié)視頻教學錄像:9分鐘
1. 整型數的除法要注意
由于整數與整數運算,其結果還是整數,除法也不例外,而很多初學者受到數學上的慣性思維影響,沒有能充分注意,導致在一些考試題(面試題)中失利,請參見下面的例程,寫出程序的輸出結果:
01 public class Demo 02 { 03 public static void main(String args[]) 04 { 05 int x=10; 06 int y=3; 07 int result=x/y; 08 System.out.println(result); 09 } 10 }
分析:由于x和y均是整數,在數據類型上,int型 / int型 = int型,所以x / y=10/3=3,而不是。本題的輸出為3,即
的整數部分。
2. C/C++語言和Java語言在布爾類型上存在顯著差別
從C/C++語言過渡來學習Java的讀者,請注意Java語言與C/C++在布爾類型上有很大區(qū)別,C/C++遵循的規(guī)則是 “非零即為真”,即所有不是零的數,都可認為是“true”,而僅把0當作false。
而Java語言的布爾類型變量,其賦值只能是true(真)和false(假)兩種。除此之外,沒有其他的值可以賦值給布爾變量。也不能用1和0分別代替true(真)和false(假)。一言蔽之,Java語言中的布爾類型與整型無關。
5.9 實戰(zhàn)練習
本節(jié)視頻教學錄像:20分鐘
1. 編寫程序,要求運行后要輸出long類型數據的最小數和最大數。
2. 改錯題:指出錯誤之處并對其進行修改(本題改編自2013年巨人網絡的Java程序員筆試題)。
程序功能:輸出int類型最小值與最大值之間的所有數是否是偶數(能被2整除的數),操作符%為求余操作。
01 public class FindEvenNumber 02 { 03 public static void main(String[]args) 04 { 05 for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i)
06 { 07 boolean isEven=(i%2==0); 08 System.out.println(String.format("i=%d,isEven=%b",i,isEven)); 09 } 10 } 11 }
3. 請運行下面一段程序,并分析產生輸出結果的原因(改編自網絡Java面試題)。
01 public class CTest 02 { 03 public static void main(String[]args) 04 { 05 06 int x=5; 07 int y=2; 08 System.out.println(x+y+"K"); 09 System.out.println(6+6+"aa"+6+6); 10 } 11 }
【運行結果】

【面試題分析】
對于第08行,按照運算符從左至右的運算順序,第一個運算表達式是5+2=7,之后運算表達式為7 + “K”,因為“K”是字符串,通過類型轉換之后將7轉換為字符,這里第二個加號“+”相當于一個字符串連接符。所以第08行的輸出結果為7K。同理可分析第09行的輸出,第一個運算表達式是6 + 6= 12,之后運算表達式為12 + “aa”,因為“aa”是字符串,整型12被轉換為字符串“12”。通過加號連接符構成新的字符串“12aa”。類似的,系統(tǒng)會自動將“12aa”后面的兩個整數“6”,逐個轉換成字符“6”,然后通過加號“+”連接成新的字符串,最終形成輸出的字符串“12aa66”。
請讀者思考一下,如果將08行字符“K”的雙引號“ ”換成單引號‘ ’,即。
System.out.println(x + y + ‘K’);
請寫出相應的輸出結果,并分析原因。
- Core Data應用開發(fā)實踐指南
- Spring源碼深度解析
- DevOps原理與實踐
- Spring開發(fā)者的Quarkus實戰(zhàn)
- 嵌入式系統(tǒng)開發(fā)之道:菜鳥成長日志與項目經理的私房菜
- 解決方案架構師修煉之道(原書第2版)
- Arduino項目開發(fā):智能家居
- 敏捷軟件開發(fā):用戶故事實戰(zhàn)
- 軟件測試之魂:核心測試設計精解
- 區(qū)塊鏈:技術原理與應用實踐
- Unity手機游戲開發(fā):從搭建到發(fā)布上線全流程實戰(zhàn)
- 軟件質量管理指南
- 軟件自動化測試成功之道:典型工具、腳本開發(fā)、測試框架和項目實戰(zhàn)
- 深入淺出系統(tǒng)虛擬化:原理與實踐
- Scrum捷徑:敏捷策略、工具與技巧