java se 7 技術手冊 - 課後練習解答

65
1 1 章課後練習 課後練習 選擇題 1. 哪個組織負責監督審察 Java 相關技術規格的演進? AJCP BApache CEU DW3C 答案:A 2. Java 技術規格必須以何種正式文件提交審察? ARFC BJSR CISO DIEEE 答案:B 3. Java 的原始碼副檔名為何?編譯完後是哪個副檔名? A*.txt*.java B*.c*.class C*.java*.class D*.cpp*.java 答案:C 4. JVM 來說,可執行檔案的副檔名為何? A*.java B*.class C*.dll D*.pyc 答案:B 5. Java 下載頁面中,可看到 JRE 下載選項,這是哪種 JREAWeb JRE

Upload: justin-lin

Post on 14-May-2015

3.683 views

Category:

Technology


6 download

DESCRIPTION

Java SE 7 技術手冊

TRANSCRIPT

Page 1: Java SE 7 技術手冊 - 課後練習解答

1

第 1 章課後練習

課後練習

選擇題

1. 哪個組織負責監督審察 Java 相關技術規格的演進?

(A) JCP

(B) Apache

(C) EU

(D) W3C

答案:A

2. Java 技術規格必須以何種正式文件提交審察?

(A) RFC

(B) JSR

(C) ISO

(D) IEEE

答案:B

3. Java 的原始碼副檔名為何?編譯完後是哪個副檔名?

(A) *.txt、*.java

(B) *.c、*.class

(C) *.java、*.class

(D) *.cpp、*.java

答案:C

4. 對 JVM 來說,可執行檔案的副檔名為何?

(A) *.java

(B) *.class

(C) *.dll

(D) *.pyc

答案:B

5. 在 Java 下載頁面中,可看到 JRE 下載選項,這是哪種 JRE?

(A) Web JRE

Page 2: Java SE 7 技術手冊 - 課後練習解答

2

(B) Private JRE

(C) Server JRE

(D) Public JRE

答案:D

6. 在 Java 下載頁面中,哪個下載選項安裝後,會有 javac 編譯器可以使用?

(A) JDK

(B) JRE

(C) JavaDoc

(D) NetBeans

答案:A

7. 如果只是要運行 Java 程式,下載程式哪個安裝即可?

(A) JDK

(B) JRE

(C) JavaDoc

(D) NetBeans

答案:B

8. Java 根據應用領域不同,區分為哪三大平台?

(A) Java SE

(B) Java EE

(C) Java ME

(D) Android

答案:A、B、C

提示:Android 並非 Java ME 規範,Android 只是在開發時,可以使用 Java 語

法,實際上編譯出來的東西,並非執行在 JVM 上。

9. 哪些平台不在 Java 規範之中?

(A) Java ME

(B) Android

(C) iOS

(D) AVI

答案:B、C、D

提示:分別是 Google、Apple 與 Nokia 主導的行動裝置平台。

10. 以下哪些包括在 JRE 之中?

(A) 開發工具程式

Page 3: Java SE 7 技術手冊 - 課後練習解答

3

(B) Java SE API

(C) JVM

(D) 部署技術

答案:B、C、D

Page 4: Java SE 7 技術手冊 - 課後練習解答

4

第 2 章課後練習

選擇題

1. 如果在 hello.java 中撰寫以下的程式碼:

public class Hello {

public static void main(String[] args) {

System.out.println("Hello World");

}

}

以下描述何者正確?

(A) 執行時顯示 Hello World

(B) 執行時出現 NoClassDefFoundError

(C) 執行時出現出現找不到主要方法的錯誤

(D) 編譯失敗

答案:D

提示:檔名必須是 Hello.java。

2. 如果在 Main.java 中撰寫以下的程式碼:

public class Main {

public static main(String[] args) {

System.out.println("Hello World");

}

}

以下描述何者正確?

(A) 執行時顯示 Hello World

(B) 執行時出現 NoClassDefFoundError

(C) 執行時出現找不到主要方法的錯誤

(D) 編譯失敗

答案:D

提示:main()方法定義語法有誤,沒有撰寫 void。

3. 如果在 Main.java 中撰寫以下的程式碼:

public class Main {

public static void main() {

System.out.println("Hello World");

}

Page 5: Java SE 7 技術手冊 - 課後練習解答

5

}

以下描述何者正確?

(A) 執行時顯示 Hello World

(B) 執行時出現 NoClassDefFoundError

(C) 執行時出現出現找不到主要方法的錯誤

(D) 編譯失敗

答案:C

提示:main()方法定義有誤,沒有撰寫 String[] args參數。

4. 如果在 Main.java 中撰寫以下的程式碼:

public class Main {

public static void main(string[] args) {

System.out.println("Hello World");

}

}

以下描述何者正確?

(A) 執行時顯示 Hello World

(B) 執行時出現 NoClassDefFoundError

(C) 執行時出現出現找不到主要方法的錯誤

(D) 編譯失敗

答案:D

提示:main()方法中的參數有誤,必須是 String而不是 string。

5. 如果 C:\workspace\Hello\classes 中有以下原始碼編譯而成的 Main.class:

public class Main {

public static void main(String[] args) {

System.out.println("Hello World");

}

}

文字模式下你的工作路徑是 C:\workspace,那麼如何執行 Main類別?

(A) java C:\workspace\Hello\classes\Main

(B) java Hello\classes Main

(C) java –cp Hello\classes Main

(D) 以上皆非

答案:C

6. 如果 C:\workspace\Hello\classes 中有以下原始碼編譯而成的 Main.class:

package cc.openhome;

Page 6: Java SE 7 技術手冊 - 課後練習解答

6

public class Main {

public static void main(String[] args) {

System.out.println("Hello World");

}

}

文字模式下你的工作路徑是 C:\workspace,那麼如何執行 Main類別?

(A) java C:\workspace\Hello\classes\Main

(B) java Hello\classes Main

(C) java –cp Hello\classes Main

(D) 以上皆非

答案:D

提示:Main.class 必須放在 C:\workspace\Hello\classes\cc\openhome 資料夾

中,執行時必須指定 java –cp Hello\classes cc.openhome.Main。

7. 如果有個 Console類別的原始碼開頭定義如下:

package cc.openhome;

public class Console {

...

}

其完全吻合名稱為何?

(A) cc.openhome.Console

(B) package.cc.openhome.Console

(C) cc.openhome.class.Console

(D) 以上皆非

答案:A

8. 如果 C:\workspace\Hello\src 中有 Main.java 如下:

package cc.openhome;

public class Main {

public static void main(String[] args) {

System.out.println("Hello World");

}

}

文字模式下你的工作路徑是 C:\workspace\Hello,那麼如何編譯與執行

Main類別?

(A) javac src\Main.java

java C:\workspace\Hello\classes\Main

(B) javac –d classes src\Main.java

Page 7: Java SE 7 技術手冊 - 課後練習解答

7

java –cp classes Main

(C) javac –d classes src\Main.java

java –cp classes cc.openhome.Main

(D) javac –d classes src\Main.java

java –cp classes/cc/openhome Main

答案:C

9. 如果有個 Console類別的原始碼開頭定義如下:

package cc.openhome;

public class Console {

...

}

如何在另一個類別中撰寫 import?

(A) import cc.openhome.Console;

(B) import cc.openhome;

(C) import cc.openhome.*;

(D) import Console;

答案:A、C

10. 關於套件以下何者正確?

(A) 要 使 用 Java SE API 的 System 類 別 必 須 import

java.lang.System;

(B) 在程式中撰寫 import java.lang.System;會發生編譯錯誤,

因為 java.lang中的類別不用 import

(C) import並不影響執行效能

(D) 程式中撰寫了 import cc.openhome.Main,執行 java 指令時

只要下 java Main 就可以了

答案:C

Page 8: Java SE 7 技術手冊 - 課後練習解答

8

第 3 章課後練習

課後練習

選擇題

1. 如果有以下的程式碼:

int number;

System.out.println(number);

以下描述何者正確?

(A) 執行時顯示 0

(B) 執行時顯示隨機數字

(C) 執行時出現錯誤

(D) 編譯失敗

答案:D

提示:number沒有初始化。

2. 如果有以下的程式碼:

System.out.println(10 / 3);

以下描述何者正確?

(A) 執行時顯示 3

(B) 執行時顯示 3.33333...

(C) 執行時出現錯誤

(D) 編譯失敗

答案:A

提示:10與 3都在 int空間中運算。

3. 如果有以下的程式碼:

float radius = 88.2;

double area = 2 * 3.14 * radius * radius;

System.out.println(area);

以下描述何者正確?

(A) 執行時顯示 48853.6272

(B) 執行時顯示 48853

(C) 執行時出現錯誤

(D) 編譯失敗

答案:D

Page 9: Java SE 7 技術手冊 - 課後練習解答

9

提示:3.14是 double型態。

4. 如果有以下的程式碼:

byte a = 100;

byte b = 200;

byte c = (byte) (a + b);

System.out.println(c);

以下描述何者正確?

(A) 執行時顯示 300

(B) 執行時顯示 127

(C) 執行時出現錯誤

(D) 編譯失敗

答案:D

提示:200超過了 byte可以儲存的範圍。

5. 如果有以下的程式碼:

System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE);

以下描述何者正確?

(A) 執行時顯示 true

(B) 執行時顯示 false

(C) 執行時出現錯誤

(D) 編譯失敗

答案:A

提示:Integer.MAX_VALUE加 1溢值後就剛好等於 Integer.MIN_VALUE。

6. 如果有以下的程式碼:

System.out.println(-Integer.MAX_VALUE == Integer.MIN_VALUE);

以下描述何者正確?

(A) 執行時顯示 true

(B) 執行時顯示 false

(C) 執行時出現錯誤

(D) 編譯失敗

答案:A

提 示 : -Integer.MAX_VALUE 位 元 全 部 就 是 1 , 剛 好 等 於

Integer.MIN_VALUE。

7. 如果有以下的程式碼:

int i = 10;

Page 10: Java SE 7 技術手冊 - 課後練習解答

10

int number = i++;

number = --i;

以下描述何者正確?

(A) 執行後 number為 10,i為 10

(B) 執行後 number為 10,i為 11

(C) 執行後 number為 11,i為 10

(D) 執行後 number為 11,i為 11

答案:A

8. 如果有以下的程式碼:

int i = 10;

int number = ++i;

number = ++i;

以下描述何者正確?

(A) 執行後 number為 11,i為 11

(B) 執行後 number為 11,i為 12

(C) 執行後 number為 12,i為 11

(D) 執行後 number為 12,i為 12

答案:D。

9. 如果有以下的程式碼:

for(int i = 1; i < 10; i++) {

if(i == 5) {

continue;

}

System.out.printf("i = %d%n", i);

}

以下描述何者正確?

(A) 顯示 i =1 到 4,以及 6 到 9

(B) 顯示 i =1 到 9

(C) 顯示 i =1 到 4

(D) 顯示 i = 6 到 9

答案:A

10. 如果有以下的程式碼:

for(int number = 0; number != 5; number = (int) (Math.random() * 10)) {

System.out.println(number);

}

Page 11: Java SE 7 技術手冊 - 課後練習解答

11

以下描述何者正確?

(A) 執行時顯示數字永不停止

(B) 執行時顯示數字 0後停止

(C) 執行時顯示數字 5後停止

(D) 執行時顯示數字直到 number為 5後停止

答案:D

實作題

1. 如果有 m與 n兩個 int變數,分別儲存 1000 與 495 兩個值,請使用程式

算出最大公因數。

2. 在三位的整數中,例如 153 可以滿足 13 + 53 + 33 = 153,這樣的數稱之為

阿姆斯壯(Armstrong)數,試以程式找出所有三位數的阿姆斯壯數。

Page 12: Java SE 7 技術手冊 - 課後練習解答

12

第 4 章課後練習

1. 如果有以下的程式碼:

int x = 100;

int y = 100;

Integer wx = x;

Integer wy = y;

System.out.println(x == y);

System.out.println(wx == wy);

在 JDK5 以上的環境編譯與執行,請問顯示結果為何?

(A) true、true

(B) true、false

(C) false、true

(D) 編譯失敗

答案:A

2. 如果有以下的程式碼:

int x = 200;

int y = 200;

Integer wx = x;

Integer wy = y;

System.out.println(x == wx);

System.out.println(y == wy);

在 JDK5 以上的環境編譯與執行,請問顯示結果為何?

(A) true、true

(B) true、false

(C) false、true

(D) 編譯失敗

答案:A

3. 如果有以下的程式碼:

int x = 300;

int y = 300;

Integer wx = x;

Integer wy = y;

System.out.println(wx.equals(x));

System.out.println(wy.equals(y));

Page 13: Java SE 7 技術手冊 - 課後練習解答

13

以下描述何者正確?

(A) true、true

(B) true、false

(C) false、true

(E) 編譯失敗

答案:A

4. 如果有以下的程式碼:

int[] arr1 = {1, 2, 3};

int[] arr2 = arr1;

arr2[1] = 20;

System.out.println(arr1[1]);

以下描述何者正確?

(A) 執行時顯示 2

(B) 執行時顯示 20

(C) 執行時出現 ArrayIndexOutOfBoundException錯誤

(D) 編譯失敗

答案:B

5. 如果有以下的程式碼:

int[] arr1 = {1, 2, 3};

int[] arr2 = new int[arr1.length];

arr2 = arr1;

for(int value : arr2) {

System.out.printf("%d", value);

}

以下描述何者正確?

(A) 執行時顯示 123

(B) 執行時顯示 12300

(C) 執行時出現 ArrayIndexOutOfBoundException錯誤

(D) 編譯失敗

答案:A

6. 如果有以下的程式碼:

String[] strs = new String[5];

以下描述何者正確?

(A) 產生 5 個 String實例

(B) 產生 1 個 String實例

Page 14: Java SE 7 技術手冊 - 課後練習解答

14

(C) 產生 0 個 String實例

(D) 編譯失敗

答案:C

7. 如果有以下的程式碼:

String[] strs = {"Java", "Java", "Java", "Java", "Java"};

以下描述何者正確?

(A) 產生 5 個 String實例

(B) 產生 1 個 String實例

(C) 產生 0 個 String實例

(E) 編譯失敗

答案:B

8. 如果有以下的程式碼:

String[][] strs = new String[2][5];

以下描述何者正確?

(A) 產生 10 個 String實例

(B) 產生 2 個 String實例

(C) 產生 0 個 String實例

(D) 編譯失敗

答案:C

9. 如果有以下的程式碼:

String[][] strs = {

{"Java", "Java", "Java"},

{"Java", "Java", "Java", "Java"}

};

System.out.println(strs.length);

System.out.println(strs[0].length);

System.out.println(strs[1].length);

以下描述何者正確?

(A) 顯示 2、3、4

(B) 顯示 2、0、1

(C) 顯示 1、2、3

(D) 編譯失敗

答案:A

10. 如果有以下的程式碼:

Page 15: Java SE 7 技術手冊 - 課後練習解答

15

String[][] strs = {

{"Java", "Java", "Java"},

{"Java", "Java", "Java", "Java"}

};

for(________ row : strs) {

for(________ str : row) {

....

}

}

空白處應該分別填上什麼?

(A) String、String

(B) String、String[]

(C) String[]、String

(D) String[]、String[]

答案:C

實作題

1. Fibonacci 為 1200 年代歐洲數學家,在他的著作中提過,若一隻免子每月

生一隻小免子,一個月後小免子也開始生產。起初只有一隻免子,一個月後

有兩隻免子,二個月後有三隻免子,三個月後有五隻免子...,也就是每個月

兔子總數會是 1、1 、2、3、5、8、13、21、34、55、89......,這就是費

氏數列,可用公式定義如下:

fn = fn-1 + fn-2 if n > 1

fn = n if n = 0, 1

請撰寫程式,可讓使用者輸入想計算的費式數個數,由程式全部顯示出來。

例如:

求幾個費式數?10

0 1 1 2 3 5 8 13 21 34

2. 請撰寫一個簡單的洗牌程式,可在文字模式下顯示洗牌結果。例如:

桃 6 磚 9 磚 6 梅 5 梅 10 心 5 梅 K 梅 6 心 J 心 1 心 6 梅 3 梅 7

磚 4 磚 1 心 7 磚 2 磚 J 梅 Q 桃 2 心 2 梅 2 心 10 桃 7 桃 1 桃 8

心 9 磚 Q 磚 7 心 3 梅 9 梅 1 心 4 桃 Q 桃 10 桃 3 磚 K 桃 K 桃 9

磚 10 梅 8 磚 3 梅 4 磚 8 磚 5 桃 5 心 8 梅 J 心 Q 桃 J 桃 4 心 K

3. 給予一個陣列,請使用程式其中元素排序為由小至大:

int[] number = {70, 80, 31, 37, 10, 1, 48, 60, 33, 80};

Page 16: Java SE 7 技術手冊 - 課後練習解答

16

4. 給予一個排序後的陣列,請撰寫程式可讓使用者在陣列中尋找指定數字,找

到就顯示索引值,找不到就顯示-1:

int[] number = {1, 10, 31, 33, 37, 48, 60, 70, 80};

Page 17: Java SE 7 技術手冊 - 課後練習解答

17

第 5 章課後練習

課後練習

選擇題

1. 如果有以下程式片段:

public class Some {

private Some some;

private Some() {}

public static Some create() {

if(some == null) {

some = new Some();

}

return some;

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 客戶端必須 new Some()產 Some生實例

(C) 客戶端必須 new Some().create()產生 Some實例

(D) 客戶端必須 Some.create()產生 Some實例

答案:A

2. 如果有以下程式片段:

int[] scores1 = {88, 81, 74, 68, 78, 76, 77, 85, 95, 93};

int[] scores2 = Arrays.copyOf(scores1, scores1.length);

其中 Arrays完全吻合名稱為 java.util.Arrays,以下描述何者正確?

(A) Arrays.copyOf()應該改為 new Arrays().copyOf()

(B) copyOf()是 static成員

(C) copyOf()是 public成員

(D) Arrays被宣告為 public

答案:B、C、D

3. 如果有以下程式片段:

public class Some {

Page 18: Java SE 7 技術手冊 - 課後練習解答

18

public int x;

public Some(int x) {

this.x = x;

}

}

以下描述何者正確?

(A) 建構 Some時,可使用 new Some()或 new Some(10)形式

(B) 建構 Some時,只能使用 new Some()形式

(C) 建構 Some時,只能使用 new Some(10)形式

(D) 沒有無引數建構式,所以編譯失敗

答案:C

4. 如果有以下程式片段:

public class Some {

public int x;

public Some(int x) {

x = x;

}

}

以下描述何者正確?

(A) new Some(10)建構物件後,物件成員 x值為 10

(B) new Some(10)建構物件後,物件成員 x值為 0

(C) Some s = new Some(10)後,可使用 s.x取得值

(D) 編譯失敗

答案:B、C

5. 如果有以下程式片段:

public class Some {

private int x;

public Some(int x) {

this.x = x;

}

}

以下描述何者正確?

(A) new Some(10)建構物件後,物件成員 x值為 10

(B) new Some(10)建構物件後,物件成員 x值為 0

(C) Some s = new Some(10)後,可使用 s.x取得值

(D) 編譯失敗

Page 19: Java SE 7 技術手冊 - 課後練習解答

19

答案:A

6. 如果有以下程式片段:

package cc.openhome.util;

class Some {

public int x;

public Some(int x) {

this.x = x;

}

}

以下描述何者正確?

(A) cc.openhome.util套件中其它程式碼可以 new Some(10)

(B) cc.openhome.util套件外其它程式碼可以 new Some(10)

(C) 可以在其它套件 import cc.openhome.util.Some;

(D) 編譯失敗

答案:A

7. 如果有以下程式片段:

public class Some {

private final int x;

public Some() {}

public Some(int x) {

this.x = x;

}

}

以下描述何者正確?

(A) new Some(10)建構物件後,物件成員 x值為 10

(B) new Some(10)建構物件後,物件成員 x值為 0

(C) Some s = new Some(10)後,可使用 s.x取得值

(D) 編譯失敗

答案:D

8. 如果有以下程式片段:

public class Some {

public static int sum(int... numbers) {

int sum = 0;

for(int i = 10; i < numbers.length; i++) {

sum += numbers[i];

Page 20: Java SE 7 技術手冊 - 課後練習解答

20

}

return sum;

}

}

以下描述何者正確?

(A) 可使用 Some.sum(1, 2, 3)加總 1、2、3

(B) 可使用 new Some().sum(1, 2, 3)加總 1、2、3

(C) 可使用 Some.sum(new int[1, 2, 3])加總 1、2、3

(D) 編譯失敗,因為不定長度引數只能用增強式 for迴圈語法

答案:A、B、C

9. 如果有以下程式片段:

public class Some {

public static void someMethod(int i) {

System.out.println("int 版本被呼叫");

}

public static void someMethod(Integer integer) {

System.out.println("Integer 版本被呼叫");

}

}

以下描述何者正確?

(A) Some.someMethod(1)顯示「int版本被呼叫」

(B) Some.someMethod(1)顯示「Integer版本被呼叫」

(C) Some.someMethod(new Integer(1))顯示「int版本被呼叫」

(D) 編譯失敗

答案:A

10. 如果有以下程式片段:

public class Main {

public int some(int... numbers) {

int sum = 0;

for(int number : numbers) {

sum += number;

}

return sum;

}

public static void main(String[] args) {

System.out.println(sum(1, 2, 3));

Page 21: Java SE 7 技術手冊 - 課後練習解答

21

}

}

以下描述何者正確?

(A) 顯示 6

(B) 顯示 1

(C) 無法執行

(D) 編譯失敗

答案:D

實作題

1. 據說創世紀時有座波羅教塔由三支鑽石棒支撐,神在第一根棒上放置 64 個

由小至大排列的金盤,命令僧侶將所有金盤從第一根棒移至第三根棒,搬運

過程遵守大盤在小盤下的原則,若每日僅搬一盤,在盤子全數搬至第三根

棒,此塔將毀損。請撰寫程式,可輸入任意盤數,依以上搬運原則顯示搬運

過程。

2. 如果有個二維陣列代表迷宮如下,0 表示道路、2 表示牆壁:

int[][] maze = {

{2, 2, 2, 2, 2, 2, 2},

{0, 0, 0, 0, 0, 0, 2},

{2, 0, 2, 0, 2, 0, 2},

{2, 0, 0, 2, 0, 2, 2},

{2, 2, 0, 2, 0, 2, 2},

{2, 0, 0, 0, 0, 0, 2},

{2, 2, 2, 2, 2, 0, 2}

};

假設老鼠會從索引(1, 0)開始,請使用程式找出老鼠如何跑至索引(6, 5)位

置,並以█代表牆,◇代表老鼠,顯示出走迷宮路徑。如下所示:

3. 有個 8 乘 8 棋盤,騎士走法為西洋棋走法,請撰寫程式,可指定騎士從棋盤

任一位置出發,以標號顯示走完所有位置。例如其中一個走法:

52 21 64 47 50 23 40 3

63 46 51 22 55 2 49 24

Page 22: Java SE 7 技術手冊 - 課後練習解答

22

20 53 62 59 48 41 4 39

61 58 45 54 1 56 25 30

44 19 60 57 42 29 38 5

13 16 43 34 37 8 31 26

18 35 14 11 28 33 6 9

15 12 17 36 7 10 27 32

4. 西洋棋中皇后可直線前進,吃掉遇到的棋子,如果棋盤上有八個皇后,請撰

寫程式,顯示八個皇后相安無事地放置在棋盤上的所有方式。例如其中一個

放法:

Page 23: Java SE 7 技術手冊 - 課後練習解答

23

第 6 章課後練習

課後練習

選擇題

1. 如果有以下程式片段:

class Some {

void doService() {

System.out.println("some service");

}

}

class Other extends Some {

@Override

void doService() {

System.out.println("other service");

}

}

public class Main {

public static void main(String[] args) {

Other other = new Other();

other.doService();

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示 some service

(C) 顯示 other service

(D) 先顯示 some service、後顯示 other service

答案:C

2. 承上題,如果 main()中改為:

Some some = new Other();

some.doService();

以下描述何者正確?

(A) 編譯失敗

Page 24: Java SE 7 技術手冊 - 課後練習解答

24

(B) 顯示 some service

(C) 顯示 other service

(D) 先顯示 some service、後顯示 other service

答案:C

3. 如果有以下程式片段:

class Some {

String ToString() {

return "Some instance";

}

}

public class Main {

public static void main(String[] args) {

Some some = new Some();

System.out.println(some);

}

}

以下描述何者正確?

(A) 顯示 Some instance

(B) 顯示 Some@XXXX,XXXX 為 16進位數字

(C) 發生 ClassCastException

(D) 編譯失敗

答案:B

提示:因為是新定義了個 ToString()方法,而非重新定義 toString()方法

4. 如果有以下程式片段:

class Some {

int hashCode() {

return 99;

}

}

public class Main {

public static void main(String[] args) {

Some some = new Some();

System.out.println(some.hashCode());

}

}

以下描述何者正確?

Page 25: Java SE 7 技術手冊 - 課後練習解答

25

(A) 顯示 99

(B) 顯示 0

(C) 發生 ClassNotFoundException

(D) 編譯失敗

答案:D

提示:因為 hashCode()在 Object中定義為 public

5. 如果有以下程式片段:

class Some {

@Override

String ToString() {

return "Some instance";

}

}

public class Main {

public static void main(String[] args) {

Some some = new Some();

System.out.println(some);

}

}

以下描述何者正確?

(A) 顯示 Some instance

(B) 顯示 Some@XXXX,XXXX 為 16進位數字

(C) 發生 ClassCastException

(D) 編譯失敗

答案:D

提示:因為加了@Override,實際上父類別中並沒有 ToString()方法

6. 如果有以下程式片段:

class Some {

abstract void doService();

}

class Other extends Some {

@Override

void doService() {

System.out.println("other service");

}

}

Page 26: Java SE 7 技術手冊 - 課後練習解答

26

public class Main {

public static void main(String[] args) {

Some some = new Other();

some.doService();

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示 other service

(C) 執行時發生 ClassCastException

(D) 移除@Override可編譯成功

答案:A

7. 如果有以下程式片段:

class Some {

protected int x;

Some(int x) {

this.x = x;

}

}

class Other extends Some {

Other(int x) {

this.x = x;

}

}

以下描述何者正確?

(A) new Other(10)後,物件成員 x值為 10

(B) new Other(10)後,物件成員 x值為 10

(C) Other中無法存取 x的編譯失敗

(D) Other中無法呼叫父類別建構式的編譯失敗

答案:D

8. 如果有以下程式片段:

public class IterableString extends String {

public IterableString(String original) {

super(original);

}

public void iterate() {

Page 27: Java SE 7 技術手冊 - 課後練習解答

27

//...

}

}

以下描述何者正確?

(A) String s = new IterableString("J")可通過編譯

(B) IterableString s = new IterableString("J")可通過

編譯

(C) 因無法呼叫 super()的編譯失敗

(D) 因無法繼承 String的編譯失敗

答案:D

提示:String類別是 final類別

9. 如果有以下程式片段:

class Some {

Some() {

this(10);

System.out.println("Some()");

}

Some(int x) {

System.out.println("Some(int x)");

}

}

class Other extends Some {

Other() {

super(10);

System.out.println("Other()");

}

Other(int y) {

System.out.println("Other(int y)");

}

}

以下描述何者正確?

(A) new Other()顯示"Some(int x)"、"Other()"

(B) new Other(10)顯示"Other(int y)"

(C) new Some()顯示"Some(int x)"、"Some()"

(D) 編譯失敗

答案:A、C

Page 28: Java SE 7 技術手冊 - 課後練習解答

28

10. 如果有以下程式片段:

class Some {

Some() {

System.out.println("Some()");

this(10);

}

Some(int x) {

System.out.println("Some(int x)");

}

}

class Other extends Some {

Other() {

super(10);

System.out.println("Other()");

}

Other(int y) {

System.out.println("Other(int y)");

}

}

以下描述何者正確?

(A) new Other()顯示"Some(int x)"、"Other()"

(B) new Other(10)顯示"Some()"、"Some(int x)"、"Other(int y)"

(C) new Some()顯示"Some(int x)"、"Some()"

(D) 編譯失敗

答案:D

提示:this()或 super()都只能出現在建構式第一行

實作題

1. 如果使用 6.2.5 設計的 ArrayList類別收集物件,想顯示所收集物件之字

串描述時,必須如下:

ArrayList list = new ArrayList();

//...收集物件

for(int i = 0; i < list.size(); i++) {

System.out.println(list.get(i));

}

請重新定義 ArrayList 的 toString()方法,讓客戶端想顯示所收集物

Page 29: Java SE 7 技術手冊 - 課後練習解答

29

件之字串描述時,可以如下:

ArrayList list = new ArrayList();

//...收集物件

System.out.println(list);

2. 承上題,若想比較兩個 ArrayList實例是否相等,希望可以如下比較:

ArrayList list1 = new ArrayList();

//...用 list1收集物件

ArrayList list2 = new ArrayList();

//...用 list2收集物件

System.out.println(list1.equals(list2));

請重新定義 ArrayList的 equals()方法,先比較收集的物件個數,再比

較各索引之物件實質上是否相等(使用各物件的 equals()比較)。

Page 30: Java SE 7 技術手冊 - 課後練習解答

30

第 7 章課後練習

課後練習

選擇題

1. 如果有以下程式片段:

interface Some {

protected void doSome();

}

class SomeImpl implements Some {

public void doSome() {

System.out.println("作一些事");

}

}

public class Main {

public static void main(String[] args) {

Some s = new SomeImpl();

s.doSome();

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示"作一些事"

(C) 發生 ClassCastException

(D) 執行時不顯示任何訊息

答案:A

2. 如果有以下程式片段:

interface Some {

int x = 10;

}

public class Main {

public static void main(String[] args) {

System.out.println(Some.x);

}

Page 31: Java SE 7 技術手冊 - 課後練習解答

31

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示 10

(C) 必須建構 Some實例才能存取 x

(D) 顯示 0

答案:B

3. 如果有以下程式片段:

interface Some {

void doSome();

}

class SomeImpl implements Some {

void doSome() {

System.out.println("作一些事");

}

}

public class Main {

public static void main(String[] args) {

Some s = new SomeImpl();

s.doSome();

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示"作一些事"

(C) 發生 ClassCastException

(D) 執行時不顯示任何訊息

答案:A

4. 如果有以下程式片段:

interface Some {

void doSome();

}

class SomeImpl implements Some {

public void doSome() {

System.out.println("作一些事");

}

Page 32: Java SE 7 技術手冊 - 課後練習解答

32

}

public class Main {

public static void main(String[] args) {

Some s = new SomeImpl();

s.doSome();

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示"作一些事"

(C) 發生 ClassCastException

(D) 執行時不顯示任何訊息

答案:B

5. 如果有以下程式片段:

interface Some {

void doSome();

}

interface Other {

void doOther();

}

class SomeOtherImpl implements Some, Other {

public void doSome() {

System.out.println("作一些事");

}

public void doOther() {

System.out.println("作其它事");

}

}

public class Main {

public static void main(String[] args) {

Some s = new SomeOtherImpl();

s.doSome();

Other o = (Other) s;

o.doOther();

}

}

以下描述何者正確?

Page 33: Java SE 7 技術手冊 - 課後練習解答

33

(A) 編譯失敗

(B) 顯示"作一些事"、"作其它事"

(C) 發生 ClassCastException

(D) 執行時不顯示任何訊息

答案:B

6. 如果有以下程式片段:

interface Some {

void doSome();

}

abstract class AbstractSome implements Some {

public abstract void doSome();

public void doService() {

System.out.println("作一些服務");

}

}

public class Main {

public static void main(String[] args) {

AbstractSome s = new AbstractSome();

s.doService();

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示"作一些服務"

(C) 發生 ClassCastException

(D) 執行時不顯示任何訊息

答案:A

7. 如果有以下程式片段:

interface Some {

void doSome();

}

abstract class AbstractSome implements Some {

public abstract void doSome();

public void doService() {

System.out.println("作一些服務");

}

Page 34: Java SE 7 技術手冊 - 課後練習解答

34

}

public class Main {

public static void main(String[] args) {

AbstractSome s = new AbstractSome() {

public void doSome() {

System.out.println("作一些事");

}

public void doService() {

}

};

s.doService();

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示"作一些服務"

(C) 發生 ClassCastException

(D) 執行時不顯示任何訊息

答案:D

8. 如果有以下程式片段:

interface Some {

void doSome();

}

public class Main {

public static void main(String[] args) {

Some s = new Some() {

public void doSome() {

System.out.println("作一些事");

}

public void doService() {

System.out.println("作一些服務");

}

};

s.doService();

}

}

以下描述何者正確?

Page 35: Java SE 7 技術手冊 - 課後練習解答

35

(A) 編譯失敗

(B) 顯示"作一些服務"

(C) 發生 ClassCastException

(D) 執行時不顯示任何訊息

答案:A

9. 如果有以下程式片段:

interface Some {

protected static final int x = 10;

}

public class Main {

public static void main(String[] args) {

System.out.println(Some.x);

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示 10

(C) 必須建構 Some實例才能存取 x

(D) 顯示 0

答案:A

10. 如果有以下程式片段:

interface Some {

void doSome();

void doService() {

System.out.println("作一些服務");

}

}

class SomeImpl implements Some {

public void doSome() {

System.out.println("作一些事");

}

}

public class Main {

public static void main(String[] args) {

Some s = new SomeImpl();

Page 36: Java SE 7 技術手冊 - 課後練習解答

36

s.doSome();

s.doService();

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 顯示"作一些事"、"作一些服務"

(C) 發生 ClassCastException

(D) 執行時不顯示任何訊息

答案:A

實作題

1. 針對 5.1 設計的 CashCard類別,老闆要你寫個 CashCardService類別,

其中有個 save()方法,可以把每個 CashCard實例的 number、balance

與 bonus 儲存下來,有個 load()方法,可以指定卡號載入已儲存的

CashCard:

public void save(CashCard cashCard)

public CashCard load(String number)

可是老闆也還沒決定要存為檔案?存到資料庫?或存到另一台電腦?你怎

麼寫 CashCardService呢?

提示:搜尋關鍵字「DAO」

2. 假設今天要開發一個動畫編輯程式,每個畫面為影格(Frame),數個影格

可組合為動畫清單(Play list),動畫清單也可由其它已完成動畫清單組成,

也可在動畫清單與清單間加入個別影格,如何設計程式解決這個需求?

提示:搜尋關鍵字「Composite 模式」

Page 37: Java SE 7 技術手冊 - 課後練習解答

37

第 8 章課後練習

選擇題

1. 如果有以下程式片段:

public class Main {

public static void main(String[] args) {

try {

int number = Integer.parseInt(args[0]);

System.out.println(number++);

} catch(NumberFormatException ex) {

System.out.println("必須輸入數字");

}

}

}

執行時若沒有指定命令列引數,以下描述何者正確?

(A) 編譯錯誤

(B) 顯示"必須輸入數字"

(C) 顯示 ArrayIndexOutOfBoundException堆疊追蹤

(D) 不顯示任何訊息

答案:C

2. 如果有以下程式片段:

public class Main {

public static void main(String[] args) {

Object[] objs = {"Java", "7"};

Integer number = (Integer) objs[1];

System.out.println(number);

}

}

根據圖 8.2,以下描述何者正確?

(A) 編譯錯誤

(B) 顯示 7

(C) 顯示 ClassCastException堆疊追蹤

(D) 不顯示任何訊息

答案:C

Page 38: Java SE 7 技術手冊 - 課後練習解答

38

3. 如果有以下程式片段:

public class Main {

public static void main(String[] args) {

try {

int number = Integer.parseInt(args[0]);

System.out.println(number++);

} catch(NumberFormatException ex) {

System.out.println("必須輸入數字");

}

}

}

執行時若指定命令列引數 one,以下描述何者正確?

(A) 編譯錯誤

(B) 顯示"必須輸入數字"

(C) 顯示 ArrayIndexOutOfBoundException堆疊追蹤

(D) 不顯示任何訊息

答案:B

4. FileInputStream 的 建 構 式 使 用 throws 宣 告 了

FileNotFoundException,如果有以下程式片段:

public class FileUtil {

public static String readFile(String name) throws ______________ {

FileInputStream input = new FileInputStream(name);

...

}

}

請問空格處填入以下哪些選項可以通過編譯?

(A) Throwable

(B) Error

(C) IOException

(D) FileNotFoundException

答案:A、C、D

5. FileInputStream 的 建 構 式 使 用 throws 宣 告 了

FileNotFoundException,如果有以下程式片段:

public class FileUtil {

public static String readFile(String name) {

FileInputStream input = null;

Page 39: Java SE 7 技術手冊 - 課後練習解答

39

try {

input = new FileInputStream(name);

...

} catch(_____________________ ex) {

...

}

}

}

請問空格處填入以下哪些選項可以通過編譯?

(A) Throwable

(B) Error

(C) IOException

(D) FileNotFoundException

答案:A、C、D

6. 如果有以下程式片段:

class Resource {

void doService() throws IOException {

...

}

}

class Some extends Resource {

@Override

void doService() throws __________________ {

...

}

}

請問空格處填入以下哪些選項可以通過編譯?

(A) Throwable

(B) Error

(C) IOException

(D) FileNotFoundException

答案:C、D

7. 如果有以下程式片段:

public class Main {

public static void main(String[] args) {

try {

Page 40: Java SE 7 技術手冊 - 課後練習解答

40

int number = Integer.parseInt(args[0]);

System.out.println(number++);

} catch(ArrayIndexOutOfBoundException | NumberFormatException ex)

{

System.out.println("必須輸入數字");

}

}

}

執行時若沒有指定命令列引數,以下描述何者正確?

(A) 編譯錯誤

(B) 顯示"必須輸入數字"

(C) 顯示 ArrayIndexOutOfBoundException堆疊追蹤

(D) 不顯示任何訊息

答案:B

8. 如果有以下程式片段:

public class Main {

public static void main(String[] args) {

try {

int number = Integer.parseInt(args[0]);

System.out.println(number++);

} catch(RuntimeException | NumberFormatException ex) {

System.out.println("必須輸入數字");

}

}

}

執行時若沒有指定命令列引數,以下描述何者正確?

(A) 編譯錯誤

(B) 顯示"必須輸入數字"

(C) 顯示 ArrayIndexOutOfBoundException堆疊追蹤

(D) 不顯示任何訊息

答案:A

9. FileInputStream 的 建 構 式 使 用 throws 宣 告 了

FileNotFoundException,如果有以下程式片段:

public class FileUtil {

public static String readFile(String name) {

try(FileInputStream input = new FileInputStream(name)) {

Page 41: Java SE 7 技術手冊 - 課後練習解答

41

...

}

}

}

以下描述何者正確?

(A) 編譯失敗

(B) 編譯成功

(C) 呼叫 readFile()時必須處理 FileNotFoundException

(D) 呼叫 readFile()時不一定要處理 FileNotFoundException

答案:A

10. 如果 ResourceSome 與 ResourceOther 都實作了 AutoCloseable 介

面:

public class Main {

public static void main(String[] args) {

try(ResourceSome some = new ResourceSome();

ResourceOther other = new ResourceOther()) {

...

}

}

}

以下描述何者正確?

(A) 執行完 try後會先關閉 ResourceSome

(B) 執行完 try後會先關閉 ResourceOther

(C) 執行完 main()後才關閉 ResourceSome與 ResourceOther

(D) 編譯失敗

答案:A

實作題

1. 針對 5.2 設計的 CashCard類別,store()與 charge()方法傳入負數時,

錯誤訊息只顯示在文字模式下,這當然不是正確的方式,請修改 store()

與 charge()方法傳入負數時,拋出 IllegalArgumentException。

2. 續上題,修改 CashCard 類別,在點數或餘額不足時,請拋出以下例外,

其中 number表示剩餘點數或餘額:

package cc.openhome.virtual;

public class InsufficientException extends Exception {

private int number;

public InsufficientException(String message, int remain) {

Page 42: Java SE 7 技術手冊 - 課後練習解答

42

super(message);

this.number = remain;

}

public int getNumber() {

return number;

}

}

Page 43: Java SE 7 技術手冊 - 課後練習解答

43

第 9 章課後練習

選擇題

1. 如果有以下程式片段:

import java.util.*;

public class Main {

public static void main(String[] args) {

foreach(new HashSet());

foreach(new ArrayList());

}

private static void foreach(___________ elements) {

for(Object o : elements) {

...

}

}

}

空白部份指定哪些型態可以通過編譯?

(A) HashSet

(B) ArrayList

(C) Collection

(D) Iterable

答案:C、D

2. 如果有以下程式片段:

import java.util.*;

public class Main {

public static void main(String[] args) {

foreach(new _____________());

}

private static void foreach(Iterable iterable) {

for(Object o : iterable) {

...

}

}

}

空白部份指定哪些型態可以通過編譯?

Page 44: Java SE 7 技術手冊 - 課後練習解答

44

(A) HashSet

(B) ArrayList

(C) Collection

(D) Iterable

答案:A、B

提示:C、D 是介面,無法建構實例

3. 如果有以下程式片段:

import java.util.*;

public class Main {

public static void main(String[] args) {

foreach(new HashSet());

}

private static void foreach(Collection collection) {

__________ elements = collection.iterator();

while(elements.hasNext()) {

System.out.println(elements.next());

}

}

}

空白部份指定哪些型態可以通過編譯?

(A) List

(B) Set

(C) Iterator

(D) Iterable

答案:C

4. 如果有以下程式片段:

import java.util.*;

class Student {

String number;

String name;

int score;

Student(String number, String name, int score) {

this.number = number;

this.name = name;

this.score = score;

}

Page 45: Java SE 7 技術手冊 - 課後練習解答

45

}

public class Main {

public static void main(String[] args) {

Set<Student> students = new TreeSet<>();

students.add(new Student("B1234", "Justin", 90));

students.add(new Student("B5678", "Monica", 100));

...

foreach(students);

}

private static void foreach(Collection<Student> students) {

for(Student student : students) {

System.out.println(student.score);

}

}

}

以下描述何者正確?

(A) 依 score從小至大顯示結果

(B) 依 toString()自然排序由小至大顯示結果

(C) 依 hashCode()自然排序由小至大顯示結果

(D) 拋出 ClassCastException

答案:D

5. 如果有以下程式片段:

import java.util.*;

class Student {

String number;

String name;

int score;

Student(String number, String name, int score) {

this.number = number;

this.name = name;

this.score = score;

}

}

public class Main {

public static void main(String[] args) {

Set<Student> students = new HashSet<>();

students.add(new Student("B1234", "Justin", 90));

Page 46: Java SE 7 技術手冊 - 課後練習解答

46

students.add(new Student("B5678", "Monica", 100));

students.add(new Student("B1234", "Justin", 100));

students.add(new Student("B5678", "Monica", 98));

students.add(new Student("B5678", "Monica", 100));

System.out.println(students.size());

}

}

以下描述何者正確?

(A) 顯示 2

(B) 顯示 3

(C) 顯示 4

(D) 顯示 5

答案:D

6. 如果有以下程式片段:

import java.util.*;

public class Main {

public static void main(String[] args) {

Set<Integer> numbers = new TreeSet<>();

numbers.add(1);

numbers.add(2);

numbers.add(1);

numbers.add(3);

foreach(numbers);

}

private static void foreach(Collection<Integer> numbers) {

for(Integer number : numbers) {

System.out.println(number);

}

}

}

以下描述何者正確?

(A) 從小至大顯示數字結果

(B) 從大至小顯示數字結果

(C) 編譯失敗

(D) 拋出 ClassCastException

答案:A

Page 47: Java SE 7 技術手冊 - 課後練習解答

47

7. 關於增強式 for迴圈語法,可適用於以下哪些型態?

以下描述何者正確?

(A) 陣列

(B) List

(C) Set

(D) Map

答案:A、B、C

8. 如果有以下程式片段:

import java.util.*;

public class Main {

public static void main(String[] args) {

Set numbers = new TreeSet();

numbers.add(1);

numbers.add(2);

numbers.add(1);

numbers.add(3);

for(Integer number : numbers) {

System.out.println(number);

}

}

}

以下描述何者正確?

(A) 從小至大顯示數字結果

(B) 從大至小顯示數字結果

(C) 編譯失敗

(D) 拋出 ClassCastException

答案:C

9. 如果有以下程式片段:

import java.util.*;

public class Main {

public static void main(String[] args) {

Set<____________> numbers = new TreeSet<>();

numbers.add(1);

numbers.add(2);

numbers.add(1);

numbers.add(3);

Page 48: Java SE 7 技術手冊 - 課後練習解答

48

for(Integer number : numbers) {

System.out.println(number);

}

}

}

空白處要填入何種型態才可編譯成功?

(A) Object

(B) Long

(C) Integer

(D) Short

答案:C

10. 如果有以下程式片段:

import java.util.*;

public class Main {

public static void main(String[] args) {

Map<String, String> messages = new HashMap<>();

messages.put("Justin", "Hello");

messages.put("Monica", "HiHi");

foreach(messages.values());

}

private static void foreach(_____________ values) {

for(String value : values) {

System.out.println(value);

}

}

}

空白處要填入何種型態才可編譯成功?

(A) Set

(B) Collection

(C) Collection<String>

(D) Iterable<String>

答案:C、D

實作題

1. 嘗試寫個 IterableString類別,可指定字串建構 IterableString實

例,讓該實例可使用增強式 for迴圈,逐一取出字串中的字元。

2. 如果有個字串陣列如下:

Page 49: Java SE 7 技術手冊 - 課後練習解答

49

String[] words = {"RADAR","WARTER START","MILK

KLIM","RESERVERED","IWI"};

請撰寫程式,判斷字串陣列中有哪些字串,從前面看的字元順序,與從後面

看的字元順序是相同的。

提示:可使用 Deque。

Page 50: Java SE 7 技術手冊 - 課後練習解答

50

第 10 章課後練習

選擇題

1. 輸入輸出串流的父類別是哪兩個?

(A) InputStream

(B) Reader

(C) OutputStream

(D) Writer

答案:A、C

2. 處理字元輸入輸出的父類別是哪兩個?

(A) InputStream

(B) Reader

(C) OutputStream

(D) Writer

答案:B、D

3. 以下哪兩個類別為 InputStream、OutputStream提供緩衝區作用?

(A) BufferedInputStream

(B) BufferedReader

(C) BufferedOutputStream

(D) BufferedWriter

答案:A、C

4. 以下哪兩個類別為 Reader、Writer提供緩衝區作用?

(A) BufferedInputStream

(B) BufferedReader

(C) BufferedOutputStream

(D) BufferedWriter

答案:B、D

5. 如果有以下程式片段:

ObjectInputStream input = new ObjectInputStream(new ________________);

空白部份指定哪些型態可以通過編譯?

(A) FileInputStream("Account.data")

(B) FileReader("Main.java")

Page 51: Java SE 7 技術手冊 - 課後練習解答

51

(C) InputStreamReader(new FileReader("Main.java"))

(D) ObjectReader("Account.data")

答案:A

6. 如果有以下程式片段:

BufferedReader reader = new BufferedReader(new ________________);

空白部份指定哪些型態可以通過編譯?

(A) FileInputStream("Account.data")

(B) FileReader("Main.java")

(C) InputStreamReader(new

FileInputStream("Main.java"))

(D) ObjectReader("Account.data")

答案:B、C

7. 以下哪兩個類別分別擁有 readObject()、writeObject()方法?

(A) BufferedInputStream

(B) ObjectInputStream

(C) ObjectOutputStream

(D) BufferedOutputStream

答案:B、C

8. 以下哪兩個類別為 InputStream、OutputStream提供編碼轉換作用?

(A) BufferedInputStream

(B) InputStreamReader

(C) BufferedOutputStream

(D) OutputStreamWriter

答案:B、D

9. 以下哪兩個類別為 Reader、Writer提供編碼轉換作用?

(A) BufferedInputStream

(B) InputStreamReader

(C) BufferedOutputStream

(D) 以上皆非

答案:D

10. 以下哪些類別位於 java.io 套件之中?

(A) BufferedInputStream

(B) IOException

Page 52: Java SE 7 技術手冊 - 課後練習解答

52

(C) Scanner

(D) BufferedReader

答案:A、B、D

實作題:

1. 在例外發生時,可以使用例外物件的 printStackTrace()顯示堆疊追

蹤,如何改寫以下程式,使得例外發生時,可將堆疊追蹤附加至 UTF-8 編

碼的 exception.log 檔案:

package cc.openhome;

import java.io.*;

public class Exercise1 {

public static void dump(InputStream src, OutputStream dest)

throws IOException {

try (InputStream input = src; OutputStream output = dest) {

byte[] data = new byte[1024];

int length = -1;

while ((length = input.read(data)) != -1) {

output.write(data, 0, length);

}

} catch(IOException ex) {

throw ex;

}

}

}

2. 請撰寫程式,可將任何編碼的文字檔案讀入,指定檔名轉存為 UTF-8 的文

字檔案。

Page 53: Java SE 7 技術手冊 - 課後練習解答

53

第 11 章課後練習

選擇題

1. 可以實作哪個介面,建立執行流程?

(A) Runnable

(B) Thread

(C) Future

(D) Executor

答案:A

2. 可以繼承哪個類別,定義執行緒執行流程?

(A) Runnable

(B) Thread

(C) Future

(D) Executor

答案:B

3. 呼叫 Thread的 start()後,執行緒會處於哪個狀態?

(A) Running

(B) Runnable

(C) Wait Blocked

(D) IO Blocked

答案:B

4. 以下哪些方法會使執行緒進入阻斷狀態?

(A) Thread.sleep()

(B) wait()

(C) notify()

(D) interrupt()

答案:A、B

5. 如果有以下程式片段:

Thread thread = new Thread(new ________________() {

public void run() {

...

}

Page 54: Java SE 7 技術手冊 - 課後練習解答

54

});

空白部份指定哪些型態可以通過編譯?

(A) Runnable

(B) Thread

(C) Future

(D) Executor

答案:A、B

提示:Thread也實作了 Runnable介面。

6. 呼叫執行緒的 interrupt()方法,會拋出哪個例外物件?

(A) IOException

(B) IllegalStateException

(C) RuntimeException

(D) InterruptedException

答案:D

7. 如果有以下程式片段:

...

public ____________ void add(Object o) {

if(next == list.length) {

list = Arrays.copyOf(list, list.length * 2);

}

list[next++] = o;

}

...

為了確保 add()在多執行緒存取下的執行緒安全,應該加上哪個關鍵字?

(A) abstract

(B) synchronized

(C) static

(D) volatile

答案:B

8. 在使用高階並行 API 時,哪個介面的實作物件可實現 synchronized的功

能?

(A) Lock

(B) Condition

(C) Future

(D) Callable

Page 55: Java SE 7 技術手冊 - 課後練習解答

55

答案:A

9. 在使用高階並行 API 時,哪個介面的實作物件可實現 Object的 wait()、

notify()、notifyAll()功能?

(A) Lock

(B) Condition

(C) Future

(D) Callable

答案:B

10. 在使用高階並行 API 時,哪個介面的實作物件可以讓你於未來取得執行結

果?

(A) Lock

(B) Condition

(C) Future

(D) Callable

答案:C

實作題:

1. 如果有個執行緒池可以分配執行緒來執行 Request實作物件的 execute()

方法,執行完後該執行緒類別必須能重複使用,該執行緒類別如何設計呢?

假設 Request介面定義如下:

public interface Request {

void execute();

}

Page 56: Java SE 7 技術手冊 - 課後練習解答

56

第 12 章課後練習

選擇題

1. Java 日誌 API 中,哪個類別負責實際輸出?

(A) Logger

(B) Handler

(C) Filter

(D) Formatter

答案:B

2. Java 日誌 API 中,輸出的日誌會經過哪兩個類別的過濾?

(A) Logger

(B) Handler

(C) Formatter

(D) Stream

答案:A、B

3. 國際化的三個重要觀念是?

(A) 地區資訊

(B) 資源包

(C) 基礎名稱(Base name)

(D) 格式化

答案:A、B、C

4. Date 的 API 有許多方法都不再建議使用,應改用哪個類別的相關方法取

代?

空白部份指定哪些型態可以通過編譯?

(A) DateFormat

(B) TimeStamp

(C) Time

(D) Calendar

答案:D

5. 哪個類別代表可重用的規則表示式?

(A) Pattern

(B) Matcher

Page 57: Java SE 7 技術手冊 - 課後練習解答

57

(C) Glob

(D) Regex

答案:A

實作題

1. 撰寫程式如下顯示本月日曆:

2. 撰寫程式可如下指定目錄與 Glob 模式,遞迴搜尋指定目錄與子目錄中符合

模式的檔案名稱,Glob 模式必須包括在""中以避免被主控台解釋為特定字

元(例如萬用字元'*')。

Page 58: Java SE 7 技術手冊 - 課後練習解答

58

第 13 章課後練習

選擇題

1. 以下哪些類別,是 java.awt.Container的子類別?

(A) java.awt.Label

(B) javax.swing.JComponent

(C) javax.swing.JButton

(D) java.awt.BorderLayout

答案:B、C

2. 以下哪些類別,是 java.awt.Component的子類別?

(A) java.awt.Label

(B) javax.swing.JComponent

(C) javax.swing.JButton

(D) java.awt.BorderLayout

答案:A、B、C、D

3. 要實作滑鼠傾聽器,可以繼承哪個類別?

(A) java.awt.event.MouseListener

(B) java.awt.event.MouseAdapter

(C) java.awt.event.KeyListener

(D) java.awt.event.KeyAdapter

答案:B

4. JFrame視窗右上角 X 按鈕按下時該採取的動作,預設是?

(A) WindowConstants.DISPOSE_ON_CLOSE

(B) WindowConstants.DO_NOTHING_ON_CLOSE

(C) WindowConstants.EXIT_ON_CLOSE

(D) WindowConstants.HIDE_ON_CLOSE

答案:D

5. 以下哪個類別是可獨立顯示,不用加入其它容器的視窗元件?

(A) java.awt.Frame

(B) java.awt.BorderLayout

(C) javax.swing.JFrame

(D) javax.swing.JButton

Page 59: Java SE 7 技術手冊 - 課後練習解答

59

答案:A、C

實作題

1. 請任選主題,使用 Swing 設計一款視窗遊戲(例如俄羅斯方塊),你也許需

要使用 Java 2D 在視窗上繪圖,可參考以下網址:

http://download.oracle.com/javase/tutorial/2d/TOC.html

Page 60: Java SE 7 技術手冊 - 課後練習解答

60

第 14 章課後練習

選擇題

1. 哪些 JDBC 驅動程式可以有跨平台的特性?

(A) TYPE 1

(B) TYPE 2

(C) TYPE 3

(D) TYPE 4

答案:C、D

2. 哪種 JDBC 驅動程式是基於資料庫所提供的 API 來進行實作?

(A) TYPE 1

(B) TYPE 2

(C) TYPE 3

(D) TYPE 4

答案:B

3. JDBC 相關介面或類別,是放在哪個套件之下加以管理?

(A) java.lang

(B) javax.sql

(C) java.sql

(D) java.util

答案:C

4. 使用 JDBC 時,通常會需要處理哪個受檢例外(Checked Exception)?

(A) RuntimeException

(B) SQLException

(C) DBException

(D) DataException

答案:B

5. 關於 Connection的描述,何者正確?

(A) 可以從 DriverManager上取得 Connection

(B) 可以從 DataSource上取得 Connection

(C) 在方法結束之後 Connection會自動關閉

(D) Connection是執行緒安全(Thread-safe)

Page 61: Java SE 7 技術手冊 - 課後練習解答

61

答案:A、B

提示:Connection 不是執行緒安全的,不可以在多執行緒環境下共用

Connection,以免發生資料錯亂的問題。

6. 使用 Statement來執行 SELECT等查詢用的 SQL 指令時,應使用下列哪

個方法?

(A) executeSQL()

(B) executeQuery()

(C) executeUpdate()

(D) executeFind()

答案:B

7. 哪個物件正確使用下,可以適當地避免 SQL Injection 的問題?

(A) Statement

(B) ResultSet

(C) PreparedStatement

(D) Command

答案:C

8. 取得 Connection之後,如何取得 Statement物件?

(A) conn.createStatement()

(B) conn.buildStatement()

(C) conn.getStatement()

(D) conn.createSQLStatement()

答案:A

9. 以下描述何者有誤?

(A) 使用 Statement一定會發生 SQL Injection

(B) 使用 PreparedStatement就不會發生 SQL Injection

(C) 不使用 Connection時必須加以關閉

(D) ResultSet代表查詢的結果集合

答案:A、B

提示:只要有正確的使用觀念,即使用 Statement 也不一定會發生 SQL

Injection。如果使用不正確,使用 PreparedStatement 也有可能發生 SQL

Injection。

10. 使用 Statement的 executeQuery()方法,會傳回哪個型態?

(A) int

Page 62: Java SE 7 技術手冊 - 課後練習解答

62

(B) boolean

(C) ResultSet

(D) Table

答案:C

實作題

1. 請嘗試撰寫一個 JdbcTemplate類別封裝 JDBC 更新操作,可以如下使用

其 update()方法:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

jdbcTemplate.update(

"INSERT INTO t_message(name, email, msg) VALUES (?,?,?)",

"測試員", "[email protected]", "這是一個測試留言");

其中 dataSource參考至 DataSource實作物件,update()第一個參數

接受更新 SQL,之後的不定長度引數可指受 SQL 中佔位字元 ?實際資料,

不定長度引數部份不一定是字串,也可接受表 14.1 列出的資料型態。

提示:搜尋關鍵字「JdbcTemplate」了解相關設計方式。

Page 63: Java SE 7 技術手冊 - 課後練習解答

63

第 15 章課後練習

選擇題

1. 以下哪個類別是.class 檔案載入 JVM 後的代表?

(A) java.lang.Class

(B) java.lang.ClassLoader

(C) java.lang.Object

(D) java.lang.Definition

答案:A

2. 以下哪個類別類別中方法的代表?

(A) java.lang.Class

(B) java.lang.reflect.Constructor

(C) java.lang.reflect.Method

(D) java.lang.reflect.Field

答案:C

3. 類別載入器都繼承自哪個類別?

(A) java.lang.Class

(B) java.lang.ClassLoader

(C) java.lang.Object

(D) java.lang.Definition

答案:B

4. 以下程式碼片段建立 ClassLoader實例,其父類別載入器是?

URL url = new URL("file:/d:/workspace/");

ClassLoader loader = new URLClassLoader(new URL[] {url});

(A) Bootstrap Loader

(B) Extended Loader

(C) System Loader

(D) null

答案:C

5. 如果 file:/d:/workspace/資料夾為空,關於以下程式碼片段,何者描述正確?

String clz1 = String.class;

URL url = new URL("file:/d:/workspace/");

Page 64: Java SE 7 技術手冊 - 課後練習解答

64

ClassLoader loader = new URLClassLoader(new URL[] {url});

Class clz2 = loader.loadClass("java.lang.String");

(A) clz1 與 clz2 參考同一實例

(B) clz1 與 clz2 參考不同實例

(C) 拋出 ClassNotFoundException

(D) 拋出 NoClassDefException

答案:A

實作題

1. 你會有個物件,它是什麼類別的實例你一無所知,它實作了哪些介面你也不

知道,你只知道物件上會 quack()方法,該怎麼寫程式來呼叫執行這個方

法?

Page 65: Java SE 7 技術手冊 - 課後練習解答

65

第 16 章課後練習

實作題

1. 在 7.2.2 中曾實作一個 ClientQueue,對 ClientQueue中 Client新增

或移除有興趣的物件,可以實作 ClientListener,並向 ClientQueue

註冊。例如:

public class ClientLogger implements ClientListener {

public void clientAdded(ClientEvent event) {

System.out.println(event.getIp() + " added...");

}

public void clientRemoved(ClientEvent event) {

System.out.println(event.getIp() + " removed...");

}

}

請設計@ClientAdded與@ClientRemoved標註,可以標註在方法上:

public class ClientLogger {

@ClientAdded

public void clientAdded(ClientEvent event) {

System.out.println(event.getIp() + " added...");

}

@ClientRemoved

public void clientRemoved(ClientEvent event) {

System.out.println(event.getIp() + " removed...");

}

}

希望的功能是,如果有 Client 加入 ClientQueue,會呼叫

@ClientAdded標註的方法,如果有 Client從 ClientQueue移除,會呼叫

@ClientRemoved標註的方法。

提示:你也許必須搭配 15.1.6 動態代理技術。