java se 7 技術手冊 - 課後練習解答
DESCRIPTION
Java SE 7 技術手冊TRANSCRIPT
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
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) 開發工具程式
3
(B) Java SE API
(C) JVM
(D) 部署技術
答案:B、C、D
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");
}
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;
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
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
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
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;
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);
}
11
以下描述何者正確?
(A) 執行時顯示數字永不停止
(B) 執行時顯示數字 0後停止
(C) 執行時顯示數字 5後停止
(D) 執行時顯示數字直到 number為 5後停止
答案:D
實作題
1. 如果有 m與 n兩個 int變數,分別儲存 1000 與 495 兩個值,請使用程式
算出最大公因數。
2. 在三位的整數中,例如 153 可以滿足 13 + 53 + 33 = 153,這樣的數稱之為
阿姆斯壯(Armstrong)數,試以程式找出所有三位數的阿姆斯壯數。
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));
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實例
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. 如果有以下的程式碼:
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};
16
4. 給予一個排序後的陣列,請撰寫程式可讓使用者在陣列中尋找指定數字,找
到就顯示索引值,找不到就顯示-1:
int[] number = {1, 10, 31, 33, 37, 48, 60, 70, 80};
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 {
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) 編譯失敗
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];
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));
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
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. 西洋棋中皇后可直線前進,吃掉遇到的棋子,如果棋盤上有八個皇后,請撰
寫程式,顯示八個皇后相安無事地放置在棋盤上的所有方式。例如其中一個
放法:
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) 編譯失敗
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());
}
}
以下描述何者正確?
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");
}
}
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() {
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
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()方法,讓客戶端想顯示所收集物
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()比較)。
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);
}
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("作一些事");
}
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();
}
}
以下描述何者正確?
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("作一些服務");
}
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();
}
}
以下描述何者正確?
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();
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 模式」
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
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;
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 {
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)) {
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) {
42
super(message);
this.number = remain;
}
public int getNumber() {
return number;
}
}
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) {
...
}
}
}
空白部份指定哪些型態可以通過編譯?
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;
}
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));
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
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);
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. 如果有個字串陣列如下:
49
String[] words = {"RADAR","WARTER START","MILK
KLIM","RESERVERED","IWI"};
請撰寫程式,判斷字串陣列中有哪些字串,從前面看的字元順序,與從後面
看的字元順序是相同的。
提示:可使用 Deque。
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")
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
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 的文
字檔案。
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() {
...
}
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
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();
}
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
57
(C) Glob
(D) Regex
答案:A
實作題
1. 撰寫程式如下顯示本月日曆:
2. 撰寫程式可如下指定目錄與 Glob 模式,遞迴搜尋指定目錄與子目錄中符合
模式的檔案名稱,Glob 模式必須包括在""中以避免被主控台解釋為特定字
元(例如萬用字元'*')。
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
59
答案:A、C
實作題
1. 請任選主題,使用 Swing 設計一款視窗遊戲(例如俄羅斯方塊),你也許需
要使用 Java 2D 在視窗上繪圖,可參考以下網址:
http://download.oracle.com/javase/tutorial/2d/TOC.html
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)
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
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」了解相關設計方式。
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/");
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()方法,該怎麼寫程式來呼叫執行這個方
法?
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 動態代理技術。