--- title: 大同大學 物件導向程式設計 期末考 筆記 description: 大同大學資訊工程學系,物件導向程式設計期末考的筆記。內容涵蓋《最新 Java 程式語言》10 到 13 章的內容。 tags: - 筆記 - Java - 物件導向程式設計 --- **授課教授**:謝禎冏 **參考書**:最新 Java 程式語言 **考試範圍**:Ch 10~13 ## 第 10 章:字串(String) **參考資料**: - https://docs.oracle.com/javase/8/docs/api/java/lang/String.html ### `String` 建構子 ```java! public String(String original); public String(char[] value); public String(char[] value, int offset, int count); public String(StringBuffer buffer); public String(StringBuilder builder); ``` ### `String` 方法 ```java! public int length(); public boolean isEmpty(); public boolean isBlank(); public char charAt(int index); public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin); public boolean equals(Object anObject); public int compareTo(String anotherString); public boolean startsWith(String prefix[, int toffset]); public boolean endsWith(String suffix); public int indexOf(int ch[, int fromIndex]); public int indexOf(String str[, int fromIndex]); public String substring(int beginIndex[, int endIndex]); public String concat(String str); public String replace(char oldChar, char newChar); public boolean matches(String regex); public boolean contains(CharSequence s); public String toLowerCase(); public String toUpperCase(); public String toString(); public static String format(String format, Object... args); public String trim(); public String strip(); public String stripLeading(); public String stripTrailing(); ``` ### 學習評量 #### 1. 請問以下程式的執行結果為何? ```java public class Ex_10_01{ public static void main(String[] argv){ String a, b; a = new String("test"); b = new String("test"); System.out.println((a == b)); } } ``` a. `true` b. `false` c. `無法編譯` d. `執行錯誤` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `false` ::: #### 2. 請問以下程式的執行結果為何? ```java public class Ex_10_02{ public static void main(String[] argv){ String a = new String(); System.out.println(a.length()); } } ``` a. `null` b. `0` c. `1` d. `執行錯誤` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `0` ::: #### 3. 請問 `a.charAt(4)` 會傳回 ```java String a = "這是變數a的內容" ``` a. `'數'` b. `'a'` c. `'的'` d. `'a的內容'` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `'a'` ::: #### 4. 承上題,請問 `a.indexOf('內')` 會傳回 a. `5` b. `6` c. `4` d. `7` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `6` ::: #### 5. 承上題,請問 `a.indexOf('內', 8)` 會傳回 a. `7` b. `8` c. `6` d. `-1` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `-1` ::: #### 6. 承上題,請問呼叫 `a.replace("變數", "常數")` 後,以下何者正確? a. `a.length()` 會傳回 `7` b. `a` 會指向字串 `"這是常數a的內容"` c. `a` 會指向字串 `"這是變數a的內容"` d. 以上皆非 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** d. 以上皆非 ::: #### 7. 請問以下何者回傳 `true`? ```java String a = "abbc12a" ``` a. `a.matches("\\w*\\d*\\w*");` b. `a.matches("\\w{4}\\d*\\w?");` c. `a.matches("\\w*\\d(2,3)\\w*");` d. 以上皆是 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** d. 以上皆是 ::: #### 8. 承上題,請問 `a.replaceAll("(\\w*\\d{2,3})(\\w*)", "$2$1")` 會傳回 a. `"aabbc12a"` b. 空字串 c. `"aabbc12"` d. `"12aabbc"` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** c. `"aabbc12"` ::: #### 9. 承上題,請問 `a.substring(2, 3)` 會傳回 a. `"bc1"` b. `"bc"` c. `"b"` d. `"c12"` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** c. `"b"` ::: #### 10. 承上題,請問 `a.matches("\\w+")` 會傳回____ :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** `true` ::: ## 第 11 章:繼承(Inheritance) <!-- ```graphviz digraph ingeritance { node[shape=record]; Shape[label = "{Shape|- x: double\l- y: double\l|+ setX()\l+ getX():double\l+ setY()\l+ getY():double\l}"]; Circle[label = "{Circle|- r: double\l|+ setR()\l+ getR(): double\l}"]; Cylinder[label = "{Cylinder|- h: double\l|+ setH()\l+ getH():double\l}"]; Rectangle[label = "{Rectangle|- w: double\l- h: double\l|+ setW()\l+ getW():double\l+ setH()\l+ getH():double\l}"]; Circle -> Shape; Cylinder -> Circle; Rectangle -> Shape; } ``` --> ### 學習評量 #### 1. 要從既有的類別繼承而定一新的類別,必須使用以下哪一個保留字? a. `extend` b. `inheritance` c. `extends` d. 以上皆非 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** c. `extends` ::: #### 2. 請看以下的程式,找出錯誤並更正之。 ```java= class Parent { int i; Parent(int i) { this.i = i; } } class Child extends Parent { Child() { } } public class Ex_11_2 { public static void main(String[] argv) { Child c = new Child(); // 產生子類別的物件 } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** ```diff=8 class Child extends Parent { Child() { + super(0); \\ 呼叫父類別建構子 } } ``` 建構子內容不能為空。 ::: #### 3. 請看以下的程式,找出錯誤並更正之。 ```java= class Parent { int i; Parent(int i) { this.i = i; } } class Child extends Parent { Child() { super.Parent(i); } } public class Ex_11_3 { public static void main(String[] argv) { Child c = new Child(20); // 產生子類別的物件 } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** ```diff=8 class Child extends Parent { - Child() { + Child(int i) { - super.Parent(i); + super(i); } } ``` ::: #### 4. 請問以下程式執行結果? ```java!= class Parent { int i; Parent(int i) { this.i = i; } } class Child extends Parent { int i = 10; Child(int i) { super(i + 10); } } public class Ex_11_3 { public static void main(String[] argv) { Child c = new Child(20); // 產生子類別的物件 Parent p = c; System.out.println(p.i); } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** ```shell! 30 ``` ::: #### 5. 承上題,如果第 19 行改成 `System.out.println(c.i);` ,請問執行結果? :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** ```shell! 10 ``` ::: #### 6. 請問以下程式執行結果? :::warning <i class="fa fa-exclamation-circle" aria-hidden="true"></i> **原因待查明** ::: ```java!= class Parent { int i = 30; int sum(int j) { return i + j; } } class Child extends Parent { int i = 10; int sum() { return this.i + super.i; } } public class Ex_11_6 { public static void main(String[] argv) { Child c = new Child(); test(c); } static void test(Parent p){ System.out.println(p.sum()); } } ``` :::danger <i class="fa fa-times-circle" aria-hidden="true"></i> **題目編譯錯誤** ```shell! Main.java:23: error: method sum in class Parent cannot be applied to given types; System.out.println(p.sum()); ^ required: int found: no arguments reason: actual and formal argument lists differ in length 1 error ``` ::: #### 7. 如果將第 23 行的 `p.sum()` 改成 `p.sum(20)`,請問執行結果? :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** ```shell! 50 ``` 呼叫了 `Parent` 的 `sum(int j)` ::: #### 8. 下列哪一個存取控制字符會讓成員變數可以被子類別存取? a. `public` b. `protected` c. `private` d. 以上皆可 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `protected` 題目不嚴謹,`public` 可以讓任何類別存取。 ::: #### 9. 如果成員變數沒有加上存取控制字符,那麼以下何者為真? a. 該成員變數就成為 `public` b. 該成員變數就不能被子類別存取 c. 該成員變數就成為 `protected` d. 該成員變數就成為 `private` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** `package private` | | Class | Package | Subclass<br>(same pkg) | Subclass<br>(diff pkg) | World | | --- | --- | --- | --- | --- | --- | | `public` | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | | `protected` | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | | *no modifier*<br>(`package private`) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | | `private` | ✔️ | ❌ | ❌ | ❌ | ❌ | java access level modifier ::: #### 10. 有關 `Object` 類別,以下何者正確? a. 類別可以不繼承 `Object` b. `Object` 定義的 `toString()` 方法會傳回空的字串 c. `Object` 類別的參照可以指向任何一種物件 d. 以上皆非 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** c. `Object` 類別的參照可以指向任何一種物件 ::: ## 第 12 章:抽象類別(Abstract Class)、介面(Interface)、內部類別(Inner Class) ### 學習評量 #### 1. 在介面中所定義的方法會自動擁有以下那些存取控制? a. `private` b. `abstract` c. `protected` d. `public` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `abstract` d. `public` ::: #### 2. 在介面中所定義的成員變數會自動擁有以下那些存取控制? a. `public` b. `protected` c. `static` d. `final` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** a. `public` c. `static` d. `final` ::: #### 3. 要實作介面時,必須使用哪一個保留字? a. `extends` b. `implements` c. `implement` d. `extend` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `implements` ::: #### 4. 有關介面,以下敘述何者錯誤? a. 當介面繼承多個父介面時,父介面之間不能有同名的成員變數 b. 實作介面時不一定要實作全部的方法 c. 單一類別可以同時實作多個介面 d. 介面中不能定義同名的方法 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `implements` ::: #### 5. 有關抽象類別,以下敘述何者錯誤? a. 在類別宣告時加上 `abstract` 存取控制字符即可成為抽象類別 b. 具有抽象方法的類別一定是抽象類別 c. 繼承抽象類別的類別一定要實作所有的抽象方法 d. 抽象類別中不能有非抽象方法 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. 具有抽象方法的類別一定是抽象類別 d. 抽象類別中不能有非抽象方法 ::: #### 6. 請說明以下程式的錯誤 ```java!= interface I1 { int i = 10; } interface I2 { int i = 20; } public class Ex_12_06 implements I1, I2 { public static void main(String[] argv){ System.out.println(i); } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** 類別 `Ex_12_06` 實作了介面 `I1`、`I2`。而在第 11 行印出 `i` 時,由於介面 `I1`、`I2` 都有定義 `i`,編譯器會無法辨識要使用 `I1` 還是 `I2` 的 `i` ::: #### 7. 請說明以下程式的錯誤 ```java!= interface I1 { int i = 10; int add(int op); } public class Ex_12_7 implements I1 { public int add(int op) { I1.i += op; return I1.i; } public static void main(String[] argv){ } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** 介面 `I1` 中定義了 `i`,此時 `i` 為 `public static final` 的。而在類別 `Ex_12_7 ` 中實作了 `add(int op)`,裡面卻對 `I1.i` 進行運算,從而導致錯誤。 ::: #### 8. 請說明以下程式的錯誤? ```java!= interface I1 { void show(String s); } public class Ex_12_8 implements I1 { void show(String s) { System.out.println("訊息為:" + s); } public static void main(String[] argv){ } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** 由於介面中所定義的方法為 `public abstract` 的,在類別 `Ex_12_8` 中實作 `show(String s)` 時並沒有使用 `public` 修飾符,這會導致定義了兩個同樣,但存取權限不同的函式,從而讓編譯器報錯。 ::: #### 9. 請問以下何者正確? a. 抽象類別中不能有非抽象方法 b. `final` 類別中不能有抽象方法 c. 抽象類別中不能有 `final` 方法 d. 抽象類別中不能有 `static` 方法 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `final` 類別中不能有抽象方法 ::: #### 10. 請說明以下程式的錯誤 ```java!= interface I1 { void show(String s); } interface I2 { String show(String s); } public class Ex_12_10 implements I1, I2 { public void show(String s) { System.out.println("訊息為:" + s); } public String show(String s) { System.out.println("訊息為:" + s); return s; } public static void main(String[] argv){ } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** 介面 `I1`、`I2` 中分別定義了兩個同名函式。而在類別 `Ex_12_10` 中實作時,會因為兩個的名稱參數一樣(即使回傳值不同),使編譯器認為 `show()` 不是多型,導致重複定義而報錯。 ::: ## 第 13 章:套件(Packages) ### 學習評量 #### 1. 以下敘述何者正確? a. 一個程式檔內只能有一個 `package` 敘述 b. `package` 敘述可以出現在任何地方 c. 介面不能包在套件中 d. 套件中只能包含類別 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** a. 一個程式檔內只能有一個 `package` 敘述 ::: #### 2. 沒有使用 `package` 敘述的類別會被包在 ________ 中。 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** 預設套件(Default Package) ::: #### 3. 以下敘述何者正確? a. 介面必須和其他類別共同儲存在程式檔中,而不能單獨儲存成一個程式檔 b. 套件下的子套件不能再包含有子套件 c. 標示為 `protected` 的類別可以由套間珠的其他類別繼承 d. 以上敘述接不正確 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** c. 標示為 `protected` 的類別可以由套間珠的其他類別繼承 ::: #### 4. 如果 `Test.java` 檔案中的內容如下: ```java! package flag.test; public class Test { ... } ``` 那麼以 ```shell! $ javac -d C:\temp Test.java ``` 編譯後,`Test.class` 會被放置在 _______ 資料夾下。 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** `C:\temp\flag\test\` `-d` 選項為指定該專案的跟目錄 ::: #### 5. 延續上題,對於使用到 `Test` 類的程式來說,可以使用哪些方式編譯及執行程式? :::warning <i class="fa fa-exclamation-circle" aria-hidden="true"></i> **答案不確定** ::: :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** ```shell! $ java -cp .;C:\temp\ program.java ``` 使用 `-cp` 選項指定類別路徑。 ::: #### 6. 請找出以下程式的錯誤 ```java!= Ex_12_6_Test.java package flag; public class Ex_12_6_Test { int i = 10; } ``` ```java!= Ex_12_6_Main.java package flag; public class Ex_12_6_Main { public static void main(String[] argv) { Ex_12_6_Test o = new Ex_12_6_Test(); System.out.println(o.i); } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** 由於類別 `Ex_12_6_Test` 的成員屬性`i` 為 `package private`,所以無法直接在類別 `Ex_12_6_Main` 中使用。 ::: #### 7. 請找出以下程式的錯誤 ```java!= Ex_12_7_Test.java package flag.exercist; public class Ex_12_7_Test { public int i = 10; } ``` ```java!= Ex_12_7_Main.java import flag.*; public class Ex_12_7_Main { public static void main(String[] argv) { Ex_12_7_Test o = new Ex_12_7_Test(); System.out.println(o.i); } } ``` :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** `import flag.*;` 並不會將子套件也引入進來,因此在存取類別 `Ex_12_7_Test` 時,編譯器會報錯。 ::: #### 8. 以下何者錯誤? a. 編譯時 `-cp` 選項與 `-classpath` 選項作用相同 b. 套件中可以有 `private` 類別 c. 使用 `import` 敘述後仍然可以用完整名稱使用套間中的類別。 d. `public` 成員可以使用在任何地方 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. 套件中可以有 `private` 類別 ::: #### 9. 以下何者正確? a. 每個程式都會自動匯入 `java.lang` 以及其所包含的所有子套件。 b. `System` 是 `java.lang` 套件中的類別 c. 以 `*` 匯入套件時會連帶匯入子套件 d. 以上皆正確 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** b. `System` 是 `java.lang` 套件中的類別 ::: #### 10. 以下何者正確? a. `protected` 的成員和沒有標示存取控制符的成員一樣只能給套件中的其他類別使用。 b. 沒有使用 `package` 敘述的所有類別都屬於同一個套件 c. 沒有使用 `import` 敘述時,必須以完整名稱才能使用套件中的類別 d. 以上皆正確 :::success <i class="fa fa-check-circle" aria-hidden="true"></i> **解答** d. 以上皆正確 題目不嚴謹,`protected` 的類別也可以給繼承給其他套件的子類別,而 *`no modifer`* 不能。 ::: ### 練習作業 ```shell! $tree . ├── make.ps1 └── ttu ├── Test.java ├── animal │ ├── Animal.java │ ├── Elephant.java │ └── Tiger.java ├── sort │ ├── ICanCompare.java │ └── Sort.java └── utils ├── NameGenerator.java └── NameList.txt 4 directories, 9 files ``` #### `ttu/animal/Animal.java` ```java! package ttu.animal; import ttu.sort.ICanCompare; public abstract class Animal implements ICanCompare { String name; double height; double weight; public Animal() { setName(""); setHeight(0); setWeight(0); } public Animal(String name) { setName(name); } public Animal(String name, double height, double weight) { setName(name); setHeight(height); setWeight(weight); } public void setHeight(double height) { this.height = height; } public double getHeight() { return height; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setWeight(double weight) { this.weight = weight; } public double getWeight() { return weight; } abstract public void move(); abstract public void info(); @Override public int compare(ICanCompare i) { return (int) (getHeight() - ((Animal) i).getHeight()); } @Override public boolean equals(ICanCompare i) { return compare(i) == 0; } } ``` #### `ttu/animal/Elephant.java` ```java! package ttu.animal; public class Elephant extends Animal { public Elephant(){ super(); } public Elephant(String name){ super(name); } public Elephant(String name, double Height, double Weight){ super(name, Height, Weight); } @Override public void move() { System.out.println("Elephant " + getName() + " is moving."); } @Override public void info() { System.out.println("==== Elephant's Info ===="); System.out.println(" Name: " + getName()); System.out.println(" Height: " + getHeight()); System.out.println(" Weight: " + getWeight()); System.out.println("========================="); } } ``` #### `ttu/animal/Tiger.java` ```java! package ttu.animal; public class Tiger extends Animal { public Tiger(){ super(); } public Tiger(String name){ super(name); } public Tiger(String name, double Height, double Weight){ super(name, Height, Weight); } @Override public void move() { System.out.println("Tiger " + getName() + " is moving."); } @Override public void info() { System.out.println("===== Tiger's Info ======"); System.out.println(" Name: " + getName()); System.out.println(" Height: " + getHeight()); System.out.println(" Weight: " + getWeight()); System.out.println("========================="); } } ``` #### `ttu/sort/ICanCompare.java` ```java! package ttu.sort; public interface ICanCompare { abstract int compare(ICanCompare i); abstract boolean equals(ICanCompare i); } ``` #### `ttu/sort/Sort.java` ```java! package ttu.sort; public class Sort { public static void bubbleSort(ICanCompare arr[], int size) { for (int i = size - 1; i >= 0; i--) { for (int j = 0; j < i; j++) { if(arr[j].compare(arr[j+1]) > 0){ ICanCompare temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } } ``` #### `ttu/util/NameGenerator.java` ```java! package ttu.utils; import java.io.File; import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class NameGenerator { public static ArrayList<String> NameList = new ArrayList<>(); public static Random rand = new Random(); public static boolean readNameList() { try { File list = new File("./ttu/utils/NameList.txt"); Scanner sc = new Scanner(list); while (sc.hasNextLine()) { NameList.add(sc.nextLine()); } sc.close(); } catch (Exception e) { System.out.println("讀取檔案失敗:" + e.toString()); e.printStackTrace(); } return true; } public static String randomName() { if (NameList.size() == 0) { if (!readNameList()) return ""; } int index = rand.nextInt((int) NameList.size()); return NameList.get(index); } } ``` #### `ttu/util/NameList.txt` ``` James John Robert Michael ... Freddie Wade ``` #### `ttu/Test.java` ```java! package ttu; import ttu.animal.*; import ttu.sort.*; import ttu.utils.*; public class Test { public static void main(String[] args) { Animal[] list = new Animal[100]; int cnt=0; for (; cnt < 5; cnt++) list[cnt] = (new Elephant( NameGenerator.randomName(), NameGenerator.rand.nextDouble(500), NameGenerator.rand.nextDouble(500) )); for (; cnt < 10; cnt++) list[cnt] = (new Tiger( NameGenerator.randomName(), NameGenerator.rand.nextDouble(500), NameGenerator.rand.nextDouble(500))); Sort.bubbleSort(list, 10); for(int i=0;i<10;i++){ list[i].info(); } } } ```