2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例 第 02 章 資料型別與運算式 2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例 處理到P42
電腦所要處理的東西稱為資料(Data),例如:貨品的名稱、單價、數量…等。這些資料必須先儲存於電腦記憶體中,然後電腦中央處理器(CPU)才能進行各種運算。不同的資料有其不同意義,有些是文字符號,有些是數值,數值可以直接用於算術運算。因此必須有所區別,稱之為資料型別(Data Type)。
2.1 基本資料型別 Java提供許多不同資料型別,應用於不同領域,佔用不同記憶體空間。Java語言的資料在被使用之前必須先宣告資料型別。
2.1.1 整數 整數型別有四種,皆是不含小數的型別,但分別佔用不同長度的記憶體空間,因此能表達的數字大小不一樣。 資料型別 記憶體 2.1.1 整數 整數型別有四種,皆是不含小數的型別,但分別佔用不同長度的記憶體空間,因此能表達的數字大小不一樣。 資料型別 記憶體 有效範圍 byte(位元組) 8 bits -27 ~ 27-1(-128 ~ 127) short(短整數) 16 bits -215 ~ 215-1(-32,768 ~ +32,767) int(整數) 32 bits -231 ~ 231-1(-2,147,483,648 ~ 2,147,483,647) long(長整數) 64 bits -263 ~ 263-1(-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
1. 在設計程式時,要視整數能表達的有效範圍來宣告 整數型別。 2. 若整數資料沒有特別指定型別,Java會依出現的整數資料範圍,自動歸類出 int 及 long 兩種型別。即範圍在 -2,147,483,648 ~ 2,147,483,647 之間的整數資料,會被視為 int 型別,超過這個範圍者會被視為 long 型別。 3. 但在 -2,147,483,648 ~ 2,147,483,647 之間的整數資料,若被指定為 long 型別,在數值後面要加上「L」或「l」。如: 數值資料「300」預設為 int 型別,若要指定使為 long 型別,則該數值資料表示方式為「300L」或「300l」。
2.1.2 浮點數 浮點數型別是指含有小數的實數,依表達的數字範圍分成 float 及 double 兩種型別。 資料型別 記憶體 有效範圍 2.1.2 浮點數 浮點數型別是指含有小數的實數,依表達的數字範圍分成 float 及 double 兩種型別。 資料型別 記憶體 有效範圍 Float (單精確浮點數) 32 bits 1.4012984×10-45 ~ 3.4028234×1038 -3.4028234×1038 ~ -1.4012984×10-45 (有效位數8位) Double (倍精確浮點數) 64 bits 4.940656458412465×10-324 ~ 1.7976931348623157×10308 -1.7976931348623157×10308 ~ -4.940656458412465×10-324 (有效位數17位)
1. 在程式敘述中,對於浮點數的表示方式,是使用科學符號。如: ① 3. 12×104 → 3. 12E4 或 3. 12e4 或 3 1. 在程式敘述中,對於浮點數的表示方式,是使用科學符號。如: ① 3.12×104 → 3.12E4 或 3.12e4 或 3.12E+4 或 3.12e+4 ② 3.12×10-4 → 3.12E-4 或 3.12e-4 ③ -48000.3 → -4.80003×104 → -4.80003E4 或 -4.80003e4 2. 所有的浮點數資料Java皆預設為 double 型別。如果要指定浮點數為 float 型別,在數值後面要加上「F」或「f」。如: 數值資料「6.253」預設為 double 型別,若要指定為 float 型別, 則該數值資料表示方式為「6.253F」或「6.253f」。
2.1.3 字元 1. 電腦無法直接處理字元,因此每一個字元都分配有一個數字編碼,稱為字元編碼。 2.1.3 字元 資料型別 記憶體 有效範圍 char(字元) 16 bits 0 ~ 216-1(0 ~ 65535)字元編碼 1. 電腦無法直接處理字元,因此每一個字元都分配有一個數字編碼,稱為字元編碼。 2. 每一個字元編碼都分別代表一個Unicode字元,其中前面128個為ASCII字元。(Unicode是一套可用來表示多國文字的字元編碼,如:英文字、中文字、日本字、簡體字 … ) 3. 字元被使用時,前後要用「’」單引號括起來。如: ① ’A’ 表示「A」字元 ② ’n’ 表示「n」字元 ③ ’3’ 表示「3」這個字元(又稱文數字,但不是數字)
4. 字元也可以用Unicode表示。如: ① ’A’ 的ASCII碼為65(十進制),轉成十六進制時為0041。 故「A」字元的Unicode碼為「\u0041」。 ② ’n’ 的ASCII碼為110(十進制),轉成十六進制時為006E。 故「n」字元的Unicode碼為「\u006E」。 ③ ’3’ 的ASCII碼為51(十進制),轉成十六進制時為0033。 故「3」字元的Unicode碼為「\u0033」。 5. 有些字元無法由鍵盤鍵入,可以用Unicode表示,也可以用特殊字元組合表示。如:
字元組合 意義 Unicode碼 \n New Line(游標移到下一行) \u000A \t Tab(游標移下一個水平定位,8格為一單位) \u0009 \' 顯示單引號「‘」 \u0027 \" 顯示雙引號「“」 \u0022 \\ 顯示反斜線「\」 \u005C
2.1.4 字串 多個字元的集合便組成了字串,字串的資料型別為 String,而字串資料的前後要用雙引號「“」括起來。如: 2.1.4 字串 多個字元的集合便組成了字串,字串的資料型別為 String,而字串資料的前後要用雙引號「“」括起來。如: ① “Hello” ② “大家來學Java2” ③ “I am a student.” ④ “12345” → 此為字串資料,不是數值資料。 2. 其實字串屬於 String 類別的物件,現在你先把它當作資料型別。因目前很難解釋清楚什麼是類別?什麼是物件?在第6章會有詳細說明。
2.1.5 布林 資料型別 記憶體 有效範圍 boolean(布林) 16 bits true(真) 或 false(假) 2.1.5 布林 資料型別 記憶體 有效範圍 boolean(布林) 16 bits true(真) 或 false(假) 1. 布林值只有兩個,分別是 true 與 false。 2. 當有兩種選擇時,就可以用布林值。 3. 布林資料型別在第3章有詳盡的說明及應用。
2.2 變數 當你要執行程式時,須先將程式和資料載入電腦的主記憶體中。但程式執行時所要處理的資料如何取得呢?也就是在撰寫程式敘述時,先將每一個要處理的資料指派一個變數來存放。每一個變數要分別取不同的名稱以便電腦識別,且每一個有名稱的變數皆會分配到主記憶體空間。這就是資料載入主記憶體的方式。
一、識別字(含變數)命名規則 在Java程式設計中,我們常會對每個變數、類別、物件、方法 … 等取一個名稱,這些名稱即為識別字(identifier)。識別字必須宣告或定義才能使用,主要規則如下: 1. 識別字名稱可以由英文字母大小寫(A~Z、a~z),數字(0~9),底線(_),或貨幣符號($)等字元組成,但 第一個字元不可以使用數字。 2. 在Java中,識別字名稱中的英文字母大小寫是有分別的。 例如:PRICE,Price,price三者分別代表不同的名稱。 3. 識別名稱最好取有意義名稱,方便程式的撰寫與維護。 例如:score(成績),name(姓名),tel_no(電話號碼)。
4. 識別名稱不可使用Java的「保留字」(Reserved word)或「關鍵字」。這些名稱已被Java事先定義好。下表為Java語言的保留字。 abstract boolean break byte byvalue case cast catch char class const continue default do double else extends false final finally float for future generic goto if implements import inner instanceof int interface long native new null operator outer package private protected public rest return short static super switch synchronized this throw throws transient true try var void volatile while
5. 下面為不合法的識別字: ① price*num → 不可使用「*」符號字元 ② boolean → 不可使用Java保留字 ③ tel no → 不允許中間使用空白 ④ 5days → 第一個字元不可以使用數字字元
資料型別 變數名稱1 [= 初值1], 變數名稱2 [= 初值2]; 二、變數的宣告 使用變數時,必須先宣告此變數的資料型態。在Java中,變數的宣告不必在程式最前面,可以在需要使用時再宣告。它的優點是可以彈性使用記憶空間,缺點是萬一宣告時,記憶空間不足時,則程式無法正常執行,尤其宣告陣列時最明顯。Java變數宣告的語法: 資料型別 變數名稱1 [= 初值1], 變數名稱2 [= 初值2]; 【簡例】 int tot = 10; // 宣告資料型別為整數的變數tot, // 並將10指派給變數tot,做為該變數的初值。 float sum, price = 2.5f; // 宣告單精確浮點數的變數sum、price // 並將2.5f指派給變數price。 double pi = 3.1416 ; // 宣告倍精確浮點數的變數pi,並指定初值3.1416 boolean is_man = true; // 宣告布林型別的變數is_man,並指定初值true
宣告一些數值資料型別的變數,並指派初值。然後將變數值一一顯示出來。
結果 6 3 1000 0.456 0.0015 1.298E13
1. 行06:因為 1000 這個數值預設為 int 資料型別,現在被指派給 long 資料型別的變數 num3,故要使用 1000L。但因 long 資料型別佔用記憶體的範圍大於 int 資料型別,若是使用 1000,程式編譯時,系統亦可接受,不會出現錯誤。 2. 行07:因為所有浮點數值皆預設為 double 資料型別,現在分別被指派給 float 資料型別的變數 num4 和 num5,故浮點數值要加上 F 或 f。因 float 資料型別佔用記憶體的範圍小於 double 資料型別,若浮點數值沒有加上 F 或 f,則程式編譯時,系統不會接受,將出現錯誤。
宣告字元及字串資料型別的變數,並指派初值,然後將變數值顯示出來。 程式 J2_2_2.java 01 public class J2_2_2 { 02 public static void main (String[] args) { 03 char ch1; 04 ch1 = 'A'; 05 char ch2 = '\u0041'; 06 char ch3 = 65; 07 String st1; 08 st1 = "大家來學Java2"; 09 String st2 = "大家來學\"Java2\""; 10 System.out.println(ch1); 11 System.out.println(ch2); 12 System.out.println(ch3); 13 System.out.println('B'); 14 System.out.println('\u0042'); 15 System.out.println(st1); 16 System.out.println(st2); 17 System.out.println("Java2\n易學易用"); 18 } 19 }
結果 A B 大家來學Java2 大家來學"Java2" Java2 易學易用
解說 1. 行03~06:’ A’ 指派給 char 資料型別變數 ch1,Unicode編碼 \u0041的字元指派給char 資料型別變數 ch2,ASCII碼65指派給char 資料型別變數 ch3 。結果在第10~12行皆顯示「A」字元。表示「A」字元的ASCII碼為「65」、Unicode編碼為「u0041」。 2. 行13~14:皆是直接顯示「B」字元資料,沒有透過指派給變數的動作。 3. 行07:宣告 String 類別的物件 st1。在現階段,你先把它看成宣告 String 資料型別的變數 st1。 4. 行08:將 "大家來學Java2" 字串資料指派給 st1 變數。然後在第15行將它顯示出來。 5. 行09:為了要顯示雙引號字元「”」,故要在該字元前面加「\」字元來組合。請看第16行的顯示結果。 6. 行17:「\n」是換行字元,故顯示時會被切割成兩行。
2.3 運算式與運算子 運算式(Expression)是由運算元(operand)和運算子(operator)所構成的。例如:「a+b」是一個加法運算式,其中a、b是屬於運算元,而「+」號則是屬於運算子(或稱運算符號)。
所謂「算術運算式」即為一般所使用的數學表示式。各個運算子與運算元的寫法如下表所示: 一、算術運算子 所謂「算術運算式」即為一般所使用的數學表示式。各個運算子與運算元的寫法如下表所示: 運算子 功能 運算式 結果 - 負數 -(-5) 5 + 加 5 + 3 8 減 5 - 3 2 * 乘以 5 * 3 15 / 除以 5.0 / 3.0 1. 6666666666666667 % 取餘數 5 % 3
1. 算術運算子兩邊的運算元,若有一邊是浮點數、一邊是 整數,那麼運算的結果會為浮點數。 1. 算術運算子兩邊的運算元,若有一邊是浮點數、一邊是 整數,那麼運算的結果會為浮點數。 2. 使用除以運算子「/」時,若兩邊的運算元皆為整數, 如遇不能整除時,會捨棄小數部分。 【簡例】 5 - 8 → 結果為 -3 6 + 2.0 → 結果為 8.0 10 / 2 → 結果為 5 (5 + 6) / 2 → 結果為 5 11 / 2.0 → 結果為 5.5 4 + 3 / 2f → 結果為 5.5 (2f為浮點數)
二、字串合併運算子 1. Java 可使用「+」當作字串合併運算子,它會將字串合併運算子前後的字串頭尾合併成一字串。 2. 使用「+」號當運算子,只要運算子前後的運算元,有一個運算元的資料型別是字串,則合併結果的資料型別就一定會為字串。
【簡例】 “abc” + “xyz” → 結果為 “abcxyz” 6 + “2.0” → 結果為 “62.0” “水晶” + 100 → 結果為 “水晶100” 10 + 2 + “3” → 結果為 “123” st = “java” “我愛” + st + 2 → 結果為 “我愛java2” n1 = 2, n2 = 5 ”n1 + n2 = “ + 2 + 5 → 結果為 “n1 + n2 = 25” n1 = 2, n2 = 5 ”n1 + n2 = “ + n1 + n2 → 結果為 “n1 + n2 = 25” n1 = 2, n2 = 5 ”n1 + n2 = “ + (n1 + n2) → 結果為 “n1 + n2 = 7”
三、關係運算子 關係運算子有 ==(相等)、!=(不相等)、>(大於)、<(小於)、>=(大於或等於)、<=(小於或等於)。經與運算元結合成關係運算式,運算後會產生 true(真)或 false(假)兩個結果。詳情請參閱第3章。
四、邏輯運算子 邏輯運算子有 &&(且)、||(或)、!(非)、<(小於)。經過與運算元結合成邏輯運算式,運算後會產生 true(真)或 false(假)兩個結果。關係運算式和邏輯運算式兩者都是在程式設計時用來構成條件的基本要件。詳情請參閱第3章。
五、指派運算子 運算子符號 意義 x=4 運算過程 x運算結果 = 指派 x = 88 88 += 相加後再指派 x += 2 五、指派運算子 運算子符號 意義 x=4 運算過程 x運算結果 = 指派 x = 88 88 += 相加後再指派 x += 2 x = 4 + 2 6 -= 相減後再指派 x -= 2 x = 4 -2 2 *= 相乘後再指派 x *= 2 x = 4 * 2 8 /= 相除後再指派 x /= 2 x = 4 / 2 %= 餘數後再指派 x %= 2 x = 4 % 2
六、單一運算子 運算子符號 意義 表示式 ++ 遞增運算子 a = c++; // 先執行a = c; 再執行c = c + 1; 六、單一運算子 運算子符號 意義 表示式 ++ 遞增運算子 a = c++; // 先執行a = c; 再執行c = c + 1; b = ++c ; // 先執行c = c + 1; 再執行b = c; -- 遞減運算子 a = d--; // 先執行a = d; 再執行d = d - 1; b = --d; // 先執行d = d - 1; 再執行b = d; 【簡例】 c = 10; c++; // 結果 c = 11 c = 10; ++c; // 結果 c = 11 c = 10; a = c++; // 結果 a = 10 , c = 11 c = 10; a = ++c; // 結果 a = 11 , c = 11
範例 J2_3_1 編輯程式,使程式執行後能在螢幕上輸出如下結果: 結果 5 / 3 = 1 5.0 / 3.0 = 1.6666666 5.0 / 3.0 = 1.6666666666666667 320
程式 J2_3_1.java 01 public class J2_3_1 { 02 public static void main (String[] args) { 03 int a1 = 5, b1 = 3; 04 System.out.println(a1 + "/" + b1 + " = " + a1 / b1); 05 float a2 = 5.0f, b2 = 3.0f; 06 System.out.println(a2 + "/" + b2 + " = " + a2 / b2); 07 double a3 = 5.0, b3 = 3.0; 08 System.out.println(a3 + "/" + b3 + " = " + a3 / b3); 09 System.out.println("3" + 5 * 4); 10 } 11 }
1. 行03:宣告a1, b1為整數變數,分別指派5與3為初值。 2. 行04:兩個整數相除的結果為整數,小數部分捨棄。 解說 1. 行03:宣告a1, b1為整數變數,分別指派5與3為初值。 2. 行04:兩個整數相除的結果為整數,小數部分捨棄。 3. 行06:單精確浮點數有效位數約為8位。 4. 行08:倍精確浮點數有效位數約為16位。 5. 行09:5乘以4為20,然後 "3" 字串與20合併成 "320" 字串。
2.4 輸出與輸入資料 要與電腦進行互動,就是能對電腦進行資料輸入,而電腦會依據資料做處理,然後再輸出處理結果。輸入資料的方式有很多種:鍵盤、滑鼠、麥克風、數位攝影機 … 等。我們已經使用過 println() 方法來輸出資料,至於資料的輸入,本章將會介紹如何在 主控制台模式下使用鍵盤輸入字元、字串、數值 … 等資料。 在主控制台輸入資料,可以利用java.io套件的BufferedReader類別的物件。套件、類別、物件等專有名詞在 第6章會說明,在前面幾章只要會正確使用即可。就如同初學者 學開車,只會使用鑰匙、控制方向盤、加油 …等常用操作即可,不必清楚汽車設計原理。等待基本功力養成,有興趣再進一步 研究。
2.4.1 輸出資料 在主控制台輸出資料,可使用 print() 與 println() 方法,在這兩個方法前面還要加上「System.out.」。執行 println() 後游標會移到下一行,而執行 print() 方法後游標 並不會移到下一行。我們直接用一個範例來介紹這兩個方法。
比較 print() 與 println() 兩方法在使用上的不同。 範例 J2_4_1 程式 J2_4_1.java 01 public class J2_4_1 { 02 public static void main(String[] args) { 03 System.out.print("懂得分享,"); 04 System.out.print("人生是彩色的!\n"); 05 System.out.println("生命的活水,"); 06 System.out.println("從分享中湧出!"); 07 } 08 }
結果 懂得分享,人生是彩色的! 生命的活水, 從分享中湧出! 解說 1. 行03、04:使用 print() 方法顯示資料後,游標並不會移位到下一 行。如要使游標移位下一行時,要加 「\n」特殊字元。 2. 行05、06:使用 println() 方法顯示資料後,游標會自動移位到下一行。
2.4.2 輸入字元 要在主控制台模式下用鍵盤輸入字元,在Java程式處理的流程中,必須包含下列幾個敘述: 2.4.2 輸入字元 要在主控制台模式下用鍵盤輸入字元,在Java程式處理的流程中,必須包含下列幾個敘述: 1. 載入 Java.io.* 套件。即在程式碼的開頭處,撰寫下面的敘述。 import java.io.*; 2. 在 main() 方法後面,加上 throws IOException。該行敘述如下: public static void main(String[] args) throws IOException { 3. 宣告字元型別的變數。 例如:宣告ch為字元型別變數的敘述如下: char ch; 4. 讀取由鍵盤輸入的字元,並指派給字元型別的變數保存。 敘述如下: ch = (char)System.in.read();
在主控制台模式下輸入字元,按 鍵後,把輸入的字元 顯示出來。 範例 J2_4_2 在主控制台模式下輸入字元,按 鍵後,把輸入的字元 顯示出來。 程式 J2_4_2.java 01 import java.io.*; 02 public class J2_4_2 { 03 public static void main(String[] args) throws IOException { 04 char ch; 05 System.out.print("請按一個字母: "); 06 ch = (char)System.in.read(); 07 System.out.println("所按的字母為: " + ch); 08 } 09 }
1. 行06:由鍵盤輸入字元後,要按 鍵,電腦才能讀取。若輸入的字元不止一個時,按 鍵後,電腦只會讀取第一個鍵入的字元。 結果 請按一個字母: W 所按的字母為: W 解說 1. 行06:由鍵盤輸入字元後,要按 鍵,電腦才能讀取。若輸入的字元不止一個時,按 鍵後,電腦只會讀取第一個鍵入的字元。 2. 行07:『"所按的字母為: " + ch』為字串『"所按的字母為: "』與存入ch變數中的字元合併,合併的結果為字串型別。
2.4.3 輸入字串 在主控制台模式下由鍵盤輸入的字元、文字、數字、符號,其實都可以視為字串。電腦在讀取時,會把按 鍵之前所鍵入的字元,當成一個字串資料。在Java程式處理的流程中, 必須包含下列幾個敘述:
1. 載入 Java.io.* 套件。 2. 在 main() 方法後面,加上 throws IOException。 3. 宣告 BufferedReader 類別的物件。例如:宣告keyin為BufferedReader 類別的物件(輸入串流物件)之敘述如下: BufferedReader keyin; 4. 建立已宣告的 BufferedReader 類別物件。例如:建立keyin物件的敘述如下: keyin = new BufferedReader(new InputStreamReader(System.in)); 5. 讀取由鍵盤輸入的字串,並指派給字串變數。敘述如下: String st = keyin.readLine();
由鍵盤輸入一串字元,按 鍵後,再把輸入的字串 顯示出來。 範例 J2_4_3 由鍵盤輸入一串字元,按 鍵後,再把輸入的字串 顯示出來。 程式 J2_4_3.java 01 import java.io.*; 02 public class J2_4_3 { 03 public static void main(String[] args) throws IOException { 04 BufferedReader keyin; 05 keyin = new BufferedReader(new InputStreamReader(System.in)); 06 System.out.print("鍵入字串: "); 07 String st = keyin.readLine(); 08 System.out.println("顯示字串: " + st); 09 } 10 }
結果 鍵入字串: Time is money. 顯示字串: Time is money. 解說 1. 行07:由鍵盤輸入的字串後,按 鍵,電腦讀取所輸入的字串,再指派給字串變數 st。
2.4.4 輸入數值 雖然由鍵盤輸入的數字會被視為字串,但只要經過資料轉換,仍然可以將文數字(數字型態的字串)變成數值,文數字可以轉換成各種數值型態的資料。 【簡例】文數字被存放在 st 字串變數中,轉換為各種數值型態資料。 ① int num = Integer.parseInt(st); // 轉換成int型別,存入num變數中 ② long num = Long.parseLong(st); // 轉成long型別,存入num變數中 ③ float num = Float.parseFloat(st); // 轉成float型別,存入num變數中 ④ double num = Double.parseDouble(st); // 轉成double型別,存入 num變數中
輸入整數字串: 2400 顯示整數數值: 2400 結果 程式 J2_4_4.java 01 import java.io.*; 02 public class J2_4_4 { 03 public static void main(String[] args) throws IOException { 04 BufferedReader keyin; 05 keyin = new BufferedReader(new InputStreamReader(System.in)); 06 System.out.print("輸入整數字串: "); 07 String st = keyin.readLine(); 08 int num = Integer.parseInt(st); 09 System.out.println("顯示整數數值: " + num); 10 } 11 } 結果 輸入整數字串: 2400 顯示整數數值: 2400
2.5 資料型別轉換 所謂資料型別轉換,就是甲種資料型別的資料,改成為乙種資料型別儲存於記憶體。資料型別的轉換有二種:自動轉換與強制轉換,一般應用於數值型別的資料,如byte,int,long,float,double等資料型別之間的轉換。 2.5.1 自動轉換 轉換後的資料型別所儲存有效範圍比原來資料型別大,此情況下在程式中不必特別宣告,電腦會自動處理。 例:int → long,float → double。
將資料型別為byte的資料,採用自動轉換方式轉為int資料型別。 範例 J2_5_1 將資料型別為byte的資料,採用自動轉換方式轉為int資料型別。 程式 J2_5_1.java 01 public class J2_5_1 { 02 public static void main (String[] args) { 03 byte byte_a = 10; 04 System.out.println("byte_a = " + byte_a); 05 int int_a; 06 int_a = byte_a; 07 System.out.println("int_a = " + int_a); 08 /* 09 int int_b = 10000; 10 System.out.println("int_b = " + int_b); 11 byte byte_b; 12 byte_b = int_b; 13 System.out.println("byte_b = " + byte_b); 14 */ 15 } 16 }
結果 byte_a = 10 int_a = 10 解說 1. 行06:此種敘述屬於資料型別自動轉換。 2. 行08~14:這個程式區段屬多行註解。若將第08行及 第14行刪除,則執式碼在編譯的過程會指出第12行的 敘述有錯誤訊息。
2.5.2 強制轉換 如果要將大範圍型別的數值資料轉換成範圍較小之數值資料,則必須使用指定型別強制轉換。轉換方式如下: (指定型別) 資料或變數 採用資料型別強制轉換,若數值資料的有效範圍大於轉換後的資料型別範圍,則轉換後資料與原資料可能會有極大差異。
將以下幾種資料型別的資料,採用強制轉換方式轉為int資料型別與byte資料型別。 範例 J2_5_2 將以下幾種資料型別的資料,採用強制轉換方式轉為int資料型別與byte資料型別。 程式 J2_5_2.java 01 public class J2_5_2 { 02 public static void main (String[] args) { 03 int int_a = 100, int_b = 100000; 04 float float_a = 12345.56f, float_b = -98765.4321f; 05 byte byte_a, byte_b; 06 float_a = int_a; 07 System.out.println("float_a = " + float_a); 08 int_b = (int)float_b; 09 System.out.println("int_b = " + int_b); 10 byte_a = (byte)int_a; 11 System.out.println("byte_a = " + byte_a); 12 byte_b = (byte)int_b; 13 System.out.println("byte_b = " + byte_b); 14 } 15 }
2. 行08:為資料型別強制轉換,只保留整數部分。 3. 行10:byte的範圍為 -128 ~ +127,因此轉換後的資料不變。 結果 float_a = 100.0 int_b = -98765 byte_a = 100 byte_b = 51 解說 1. 行06:為資料型別自動轉換。 2. 行08:為資料型別強制轉換,只保留整數部分。 3. 行10:byte的範圍為 -128 ~ +127,因此轉換後的資料不變。 4. 行12:因int_b = -98765,小於-128,轉換後資料值會與原資料值不同。
2.5.3 轉換成字串資料 任何資料型別皆可以透過String類別的valueOf() 方法,轉換成字串資料。如下: 2.5.3 轉換成字串資料 任何資料型別皆可以透過String類別的valueOf() 方法,轉換成字串資料。如下: ① st = String.valueOf(true); // st = “true” ② st = String.valueOf(2000); // st = “2000” ③ st = String.valueOf(1.95); // st = “1.95” ④ double num = 1.45E-35; st = String.valueOf(num); // st = “1.45E-35” ⑤ st = String.valueOf(1.2E5); // st = “120000.0”
2.6 實例 先後輸入兩個人的體重(體重的資料型別為浮點數),再計算 兩個人的平均體重 。 程式 J2_6_1.java 01 import java.io.*; 02 public class J2_6_1 { 03 public static void main(String[] args) throws IOException { 04 BufferedReader keyin; 05 keyin = new BufferedReader(new InputStreamReader(System.in)); 06 double w1, w2, ave; 07 System.out.print("輸入 1 號體重: "); 08 String st = keyin.readLine(); 09 w1 = Double.parseDouble(st);
10 System.out.print("輸入 2 號體重: "); 11 w2 = Double.parseDouble(keyin.readLine()); 12 ave = (w1 + w2 ) / 2; 13 String st_ave = String.valueOf(ave); 14 System.out.print("兩人平均體重 : " + st_ave); 15 //System.out.print("兩人平均體重 : " + ave); 16 } 17 }
結果 解說 1. 行01:載入java.io套件。 2. 行08、09:可合併成一行。請參考第11行。 輸入 1 號體重: 50.3 輸入 2 號體重: 67.4 兩人平均體重 : 58.85 解說 1. 行01:載入java.io套件。 2. 行08、09:可合併成一行。請參考第11行。 3. 行09、11:應用readLine()方法所讀入資料為字串,將數值資料轉為倍精確浮點數。 4. 行13:將double資料型別的ave變數轉換成字串資料。 5. 行14:為字串資料與字串變數合併成一個字串。 6. 行15:第13、14行可合併成一行敘述。雖然是字串資料與double資料型別變數ave相加,但相加的運算元當中,只要有一個運算元的資料型別為字串,則合併結果就會為字串資料。
輸入貨品名稱、單價與數量,利用單價與數量相乘獲得金額,然後輸出相關資料。 實例1 J2_6_2 輸入貨品名稱、單價與數量,利用單價與數量相乘獲得金額,然後輸出相關資料。 程式 J2_6_2.java 01 import java.io.*; 02 public class J2_6_2 { 03 public static void main(String[] args) throws IOException { 04 String goods_name; // 貨品名稱變數 05 float price, money; // 單價變數, 金額變數 06 int num; // 數量變數 07 BufferedReader keyin; // 輸入串流物件 08 keyin = new BufferedReader(new InputStreamReader(System.in)); 09 System.out.print("輸入貨品名稱: "); 10 goods_name = keyin.readLine();
11 System.out.print("輸入單價: "); 12 price = Float.parseFloat(keyin.readLine()); 13 System.out.print("輸入數量: "); 14 num = Integer.parseInt(keyin.readLine()); 15 money = price * num; 16 System.out.println(""); 17 System.out.println("貨品名稱: " + goods_name); 18 System.out.println("單價: " + price + “元”); 19 System.out.println("數量: " + num); 20 System.out.println("金額: " + money + “元”); 21 } 22 }
結果 輸入貨品名稱: A4紙張 輸入單價: 0.45 輸入數量: 500 貨品名稱: A4紙張 單價: 0.45元 數量: 500 金額: 225.0元 解說 1. 行04~07:將本實例會出現的變數與物件集中宣告。這個動作是編輯程式碼時要養成的習慣。好處是管理方便,日後要維護時,程式碼較容易閱讀,也可以避免變數名稱重複被宣告。 2. 行04:貨品名稱為字串。 3. 行12:單價為輸入字串後轉為浮點數。 4. 行14:數量為輸入字串後轉為整數。 5. 行16:空出一行空白行。
============================ A4紙張 0.45 500 225.0 實例1 J2_6_3 由鍵盤輸入貨品名稱、單價與數量,然後先輸出欄位名稱,再輸出資料。 結果 輸入貨品名稱: A4紙張 輸入單價: 0.45 輸入數量: 500 貨品名稱 單價 數量 金額 ============================ A4紙張 0.45 500 225.0
程式 J2_6_3.java 01 import java.io.*; 02 public class J2_6_3 { 03 public static void main(String[] args) throws IOException { 04 BufferedReader keyin = new BufferedReader( new InputStreamReader(System.in)); 05 System.out.print("輸入貨品名稱: "); 06 String goods_name = keyin.readLine(); 07 System.out.print("輸入單價: "); 08 float price = Float.parseFloat(keyin.readLine()); 09 System.out.print("輸入數量: "); 10 int num = Integer.parseInt(keyin.readLine()); 11 float money = price * num; 12 System.out.println("\n貨品名稱\t單價\t數量\t金額"); 13 System.out.println("================================"); 14 System.out.println(goods_name + "\t\t" + price + "\t" + num + "\t" + money); 15 } 16 }
解說 1. 本實例的程式碼有兩個地方比較特別: ① 將宣告變數的敘述與指派變數值的敘述合併成一行。如: 第06行、第08行、第10行,甚至第04行也是兩行敘述合 併成一行。 ② 程式敘述太長,以致一行擠不下,造成一個敘述須多行 編寫。如:第04行、第13行、第14行。 2. 行12:顯示「貨品名稱 單價 … 」字串之前,因為有「\n」換行字元,故先空出一行空白列。 3. 行12:又因為有「\t」跳格字元,一次跳8格,會將欄位格式化排列。而「貨品名稱」字串佔滿8格,因此「單價」從第17格位置開始顯示。 4. 行14:price變數值從第17格位置開始顯示。