勘誤表

當初出版之前,雖然已經經過了多次的校對,可是印刷出來還是發現錯誤了。除了心裡覺得有點不好意思之外,重要的就是提供一個勘誤表。從寫程式的經驗來看, 未來勘誤表應該會有不同的版本,本勘誤表是以 2008.09 初版為準。

作者:呂瑞麟和陳宜惠
最後更正日期:


頁 數/段數/行數 更 正前 更 正後
iv/2-1 武功新法 武功心法
1-9   STEP 04 和 05 可以不要執行
1-24/ 第 6 題 將其變 更為 "Hello World" 將其變 更為 "Hello World"(含雙引號)
2-2/第 2-1 節的標題 武功新法 武功心法
2-6/第 2 段 程式的第 01, 02, 03, 07 行 程式的第 01, 02, 03, 08 行
2-10/第 2 個框框 類別名稱物件名稱 = new 類別名稱(); 類別名稱  物件名稱 = new 類別名稱();
2-12/DisplayCurrentDate2 程式碼的第 05 行 05 class DisplayCurrentDate2 05 public class DisplayCurrentDate2
2-19/練習題/第 6 行 在下列程式中 3. 在下列程式中
3-3/ 倒數第 7 行 圖 3.2-1 圖 3.1-1
3-12/ 練習題/第 2 行 圖 3.1-4 圖 3.2-4
3-14/ 練習題/最後一行 總共有 多少為數 總共有 多少位數
3-23/ 加到最 後一段(大多數運算子的結合規則...)之前

上列運算式的運算順序,有一個更嚴謹的表達方式。由 於運算優先順序、運算規則、以及結合規則的關係,上列運算式的運算過程如下:

 

1.      由於優先順序以及結合規則的關係,Java會首先將 y – z 結合(或稱 group)在一起,而形成如下的運算式:

x = (y – z) + m;

2.      然後,Java (y – z) + m 結合成 ((y – z) + m)

x = ((y – z) + m);

3.      依據運算規則,先運算 = 號右邊的 ((y – z) + m);由於必須先算出 + 左邊的運算元,因此 y – z 首先被執行。

4.   y – z 計算之後,再來 依次執行 +,最後 =
3-24/ 步驟 1 到 4 刪除

1.      運算式中總共有六個運算子(包含一個 =,兩個加法 +,一個負號 -,一個 *,以及一個 /);其中 這個運算子是一個單一運算元的運算子。由於它的優先 順序最高,所以第一個結合的部份就是 (–b)

2.      由於 * / 的優先順序較高,而且結合規則是由左而右,因此Java會先結合 (c*d),然後再結合 e 而成 ((c*d) / e)

3.      類似步驟二的原理,Java 會先結合 (a + (–b)),然後再結合第二個步驟的結果而成 ((a + (–b)) + ((c*d) / e))

4.      由於執行 = 之前,Java必須先取得步驟三的結果,因此Java開始運算((a + (–b)) + ((c*d) / e))

5.      Java首先看到 +,所以先求取其左邊運算元(也就是(a + (–b)))的結果;由於a的值為已知,所以第一個執行的運算子就是負號 -(也就是計算 –b),左右兩邊的運算元都取得後,再來就是執行 +

6.      由於步驟五已經得到運算式 ((a + (–b)) + ((c*d) / e)) 左邊運算元的值,再來Java就開始計算右邊運算元(也就是 (c*d) / e))的值。由於必須先計算 (c * d) 的值,所以 * 是第三個執行的運算子,然後才是 /

7.      這時候由於運算式 ((a + (–b)) + ((c*d) / e)) 左 右兩邊的運算元都計算出來了,所以 + 就被執行。

8.      最後,就執行 = 把運算式 ((a + (–b)) + ((c*d) / e)) 的 結果指定給x

3-24/ 圖 3.4-3
3-43/TestConstant 程式碼第 02 行 String[] argv String[] args
3-48/表3.10-1/第 5 列 從字串中取出從索引位置 beginIndex 開始一直到索引位置 endIndex 的子字串 從字串中取出從索引位置 beginIndex 開始一直到索引位置 endIndex-1 的子字串
3-56/ 第 4 題 d1 = new Date; d1= new Date();
3-57/ 第 11 題 請將本 題移到第四章的習題
3-59/ 第 24 題 公式 公式
4-8/程式碼倒數第 3 行 return hours * 10; return hours * 100;
4-9/圖 4.1-2 house=15 hours=15
4-25/練習題/第 3 題 n = new String(w.getName());
n = w.getName();
name = new String(w.getName());
name = w.getName();
4-55/第 4 題

假設已經存在一個 Person 類別,該類別包含資料成員 name(和 birthday)以及必要的 accessor/mutator。請定義一個 Vehicle 類別, 該類別的資料成員只包含 owner(資料型態為 Person);方法成員包含一對 accessor 及 mutator ,其中 accessor 是拿來取得 owner 資料,mutator 是拿來設定 owner 的資料;此外,請另外定義 getOwnerName() 方法讓它可以存取 Person 類別的 name。[ 提示:若允許,可以將 birthday 加 進需求而新增 getOwnerBirthday() 方法]

4-55/第 6 題/程式碼第 3 行 compute(flat x) compute(float x)
5-14/ 第二個程式方塊的第一個敘述 if(amount >= 20000) { if(amount >= 200000) {
5-16/ 片段 1 和片段 2 if(amount >= 20000) if(amount >= 200000)
5-17/ 第一個程式方塊 if(amount >= 20000) { if(amount >= 200000) {
5-17/ 片段 3 和片段 4 if(amount >= 20000) if(amount >= 200000)
6-12/練習題 如果程式中 N! 的資料型態為 int,請讀者在執行程式的時候,注意一下輸出的值,並說明為什麼? 如果程式中 N! 的資料型態為 int,當 N 越來越大的時候,請注意一下輸出的值,會不會有很怪的結果?如果有,請說明為什麼?
6-15/第一個程式方塊 for(int j=0; j<=i; j++) for(int j=1; j<=i; j++)
6-16/第一個程式方塊 for(int i=1; i<=n; i--) { for(int i=1; i<=n; i++) {
6-16/第一個程式方塊 print("*"); 和  println(""); System.out.print("*"); 和  System.out.println("");
6-17/第一個程式方塊 for(int i=0; i<n; i--) { for(int i=0; i<n; i++) {
6-17/第一個程式方塊 print("*"); 和  println(""); System.out.print("*"); 和  System.out.println("");
6-18/第一個程式方塊 print("*"); 和  println(""); System.out.print("*"); 和  System.out.println("");
6-39/練習題 Fibanacci Fibonacci
6-40/第1題 將題目從第6章移到第12章,並將題目改成"使用者執行Java程式的時候,可以在命令列輸入參數給 該Java程式使用。請寫一個Test.java,該程式會列印出使用者輸入的參數; 若參數個數大於一,則列印出的每一個參數之間以逗點分開。"
6-40/第3題 試 利用while迴圈將習題2的內容改寫。 請將習 題2的內容改寫成 while 迴圈。
6-40/第4題 試 利用do while迴圈將習題2的內容 改寫。 請將習 題2的內容改寫成 do-while 迴圈。
6-40/第5題 real double
6-40/第6題 請移到第3章
6-41/第12題/程式碼第3行 public void setLength(double length) { public void setLength(double len) {
6-41/第12題/第4小題的第3行 敘述,這個敘述被定義 的 方法,這個方法被定義
6-42/第13題/程式碼第1行 for(int i=1.0; i<2.0; i+=0.1) { for(int i=1; i<2.0; i+=0.1) {
6-42/第14題 試將下列程式碼,將它轉換成另一種描述方式,從 do-while 到 loop-and-a-half 格式。 若 將下列的程式碼 while 內的條件式改成 true試修改下列程式碼使得修改後的執行結 果與修改前相同。
6-42/第16題/第2行 只做這一次迴圈 跳出迴圈
6-43/第17題 試 利用 loop 方法 試 利用迴圈方式
6-43/第18題/程式碼 請在第3行和第4行之間加入
public Circle() { }
6-43/第18題/第3小題 試 寫一段程式碼來定義一個新的建構元。 試 寫一段程式碼來使用前一題的建構元。
6-43/第18題/第4小題 及輸入所有五個圓的所有範圍 並 輸出五個圓的面積總和
8-23/ 第 7 行 integer、 flood、double integer、 float、double
8-31/ 第 5 題 請將本 題移到第 12 章
8-31/ 第 8 題/程式碼第2、3行 w.setName("John").
setHours(45);
w.setName("John").setHours(45);
9-37/圖 9.7-1 圖右邊的 private 和 none 要對調
9-39/圖 9.7-2 圖右邊的 private 和 none 要對調
9-40/Worker 程式碼 public String name; protected String name;
9-44/Worker1 程式碼 public String name; protected String name;
9-51/9-10.1節最後一段 由於 w 實際上是一個  SalaryWorker 的物件..... 由於 w 實際上是一個  SalaryWorker 的物件,而 SalaryWorker 物件又是一個 Worker 物件,因此兩個 if 敘述的結果都是 true。
9-57/第 8 題 可能不能用 super.super.add() 能不能用 super.super.add()
10-41/ 第 8 題/第 (1) 題 請重新撰寫Vehicle的敘述,讓 Vehicle不能被建立。 請重新撰寫Vehicle,使得 Vehicle 物件不能被建立。
10-41/ 第 8 題/第 (2) 題 Car必須有其它的資料成員如下所述 Car必須有的成員如下所述
10-43/ 第 6 題/程式碼第2行 int (num < 0) { if (num < 0) {
10-44/ 第 10 題 gender 的值不是MALE就是FEMALE gender 的值不是 MALE 也不是 FEMALE 的時候,會出現 aeertion error。
11-2/11-2節 第2行 允許一個單一的變數可以參考(refer)多個物件 允許一個單一的變數可以參考(refer)不同類別型態的物件
11-4/第1行 參考多個物件 參考不同類別型態的物件
11-18/練習題第一行的最後一句 請問跟繼承架構, 請問該繼承架構
11-23/第一行 究竟應該把需要的類別設計成繼承架構中的父類別(一般類別、或者是抽象類別)?還是應該設計成介面型態? 究竟應該把繼承架構中的父類別設計成一般類別、抽象類別、或者是介面型態?
12-3/ 第二段第二行第二句 就跟之 前 new 物件的方是一樣 就跟之 前 new 物件的方式一樣
12-7/ 練習題/加上一句話 並定義 下列功能的方法:計算總薪資、平均薪資、查詢某一月份的薪資、以及回傳12個月份薪資清單的字串。
12-9/ 第三行 大小為 3 大小為 5
12-21/ 圖 12.4-9 修改 圖 12.4-9
12-27/第一段第一行 (一般簡寫成3x4) (一般簡寫成4x3)
12-34/ 最後一行 圖 12.7-2 所示 圖 12.7-2(a) 所示
12-35/ 圖 12.7-2 在圖的 下方加上 (b);另外,再加上下圖並標示為 (a)。
圖 12.7-2(a)
12-35/ 第三行 sales [0]。 sales [0],如圖 12.7-2(b) 所示。
12-37/第一個程式碼的第五行 sales[4] = new int [2]; sales[3] = new int [2];
12-42/第二段的第五行 :請留意,雖然修改後,......,其姓名仍然是John: 刪除(從第五行的冒號一直到第六行的冒號),並加入分號(;)
12-45/ 第二個程式碼區塊 Worker w = any.get(2); Worker w = (Worker) any.get(2);
12-54/ 第15題最後幾個字 它本身索引值 它本身索引值的和
13-8/第四段第一行 Write 類別 Writer 類別
13-23/第二行 利用 File 物件來開始檔案 利用 File 物件來開啟檔案
13/31/第三和四行 showOpenDigloa() 方法 showOpenDialog() 方法
13/31/第四行 如果使用者選擇"取消"按鈕 如果使用者點選"開啟"按鈕
13-38/第7題第一句 來 得到整檔案 來 得到整個檔案
14-18/第一段第二行 像監控者註冊 向監控者註冊
14-24/第三段第一行 Input、、compButton、和 clrButton InputcompButton、和 clrButton
14-33/練習題 最好每一個區塊都是一下 最好每一個區塊都試一下
14-35/ 圖 14.6-5 npan cpan
14-35/ 最後一段第三行 兩個 npan 都改成 cpan
14-50/ 程式碼/第 10 行 display(e, sport); display(e, computer);
14-50/ 程式碼/第 13 行 display(e, sport); display(e, movie);
14-53/第一段第四行 我們知道能處理 JCheckBox 我們知道能處理 JRadioButton
14-85/ 第13題 假設我們定義了一個父類別名稱為 Employee以及其二個子類別HourlyEmployeeSalaryEmployee,這三個類別的程式碼列示如下。在程 式碼中,我們也提供了部份的GUI測試程式。下面的圖呈現了這個程式執 行的畫面:使用者可以輸入想用HourlyEmployee還是SalaryEmployee;若使用者選擇SalaryEmployee,第二個文字欄位的標籤會變成”Salary”,如圖 (a)所示。若使用者選擇HourlyEmployee,第二個文字欄位的標籤會變成”Hours”,如圖 (b)所示。當姓名和薪資(或者工作時數) 輸入完成並點選”OK”按鈕,這些輸入的值會產生一個相對應 的HourlyEmployee或者SalaryEmployee物件;為了簡化問題,我們假設最多只 會產生10個員工物件。若使用者點選”Total”按鈕,則該物件的薪資會被顯示出來, 如圖 (b)所示。請完成下列程式碼中問題 (I)(II)、和 (III)並定義程式所需的TotalAction類別。
14-85/ 第13題/加上程式碼 程式碼


作者:呂瑞麟和陳宜惠
最後更正日期: