Java 入門指南
單元 11 - 介面與套件
定義介面 (interface) 使用關鍵字 interface ,套件 (package) 則用關鍵字 package
類別 (class) 除了可以繼承 (inheritance) 之外,也可以實作介面,介面基本上是宣告成員 (member) ,例如屬性 (field) 跟方法 (method) ,但是不實作方法內容,例如
interface shape {
public double PI = 3.14;
public double getPerimeter();
public double getArea();
}
以上介面 shape 宣告常數 PI 與兩個方法, getPerimeter() 用來計算周長, getArea() 計算面積。
類別如果要實作介面使用關鍵字 implements ,例如實作以上的 shape
public class CircleDemo implements shape
介面像是一組規格,實作介面就是實作這組規格,實作相同介面的類別具有相同的規格。
這樣 CircleDemo 就必須實作 shape 中的 getPerimeter() 與 getArea() 。
以下為完整程式
/*
* 檔名:CircleDemo.java
* 作者:張凱慶
* 網站:http://kaiching.org
*/
package circledemo;
interface shape {
public double PI = 3.14;
public double getPerimeter();
public double getArea();
}
public class CircleDemo implements shape {
private double radius;
public CircleDemo(double radius) {
this.radius = radius;
}
public double getPerimeter() {
return 2 * this.radius * this.PI;
}
public double getArea() {
return this.PI * this.radius * this.radius;
}
public static void main(String[] args) {
CircleDemo demo = new CircleDemo(100.1);
System.out.println();
System.out.println(demo.getPerimeter());
System.out.println(demo.getArea());
System.out.println();
}
}
CircleDemo 作為圓形的類別,因此周長與面積的計算都採取圓形的計算公式
public double getPerimeter() {
return 2 * this.radius * this.PI;
}
public double getArea() {
return this.PI * this.radius * this.radius;
}
執行結果如下
628.628 |
31462.8314 |
套件是 Java 程式組織程式檔案的方式,我們利用 NetBeans 建立專案的預設程式碼,也都有定義套件,例如
package packagedemo;
以上是 PackageDemo 專案, NetBeans 會帶入全小寫英文字母的套件名稱。
自行設定的專案可以用套件組織程式檔案,例如在 PackageDemo 專案的原始碼資料夾中建立 📁classdemo06 資料夾
程式原始碼檔案在專案資料夾 📁src 的 📁packagedemo 中。
然後把上一個單元的 Animal.java 、 Elephant.java 與 Mouse.java 複製到這個資料夾中
Animal.java 、 Elephant.java 與 Mouse.java 的套件名稱為 classdemo06 ,所在的資料夾名稱必須跟套件名稱相同,如果不相同, NetBeans 會發生找不到路徑的錯誤。
繼續看到 PackageDemo.java 的內容
/*
* 檔名:PackageDemo.java
* 作者:張凱慶
* 網站:http://kaiching.org
*/
package packagedemo;
import classdemo06.Animal;
import classdemo06.Elephant;
import classdemo06.Mouse;
import java.util.ArrayList;
import java.util.List;
public class PackageDemo {
public static void main(String[] args) {
List<Animal> animal_list = new ArrayList<Animal>();
animal_list.add(new Animal());
animal_list.add(new Elephant());
animal_list.add(new Mouse());
for (Animal item:animal_list) {
item.speak();
}
}
}
這裡看到引入 classdemo06 套件的內容
import classdemo06.Animal;
import classdemo06.Elephant;
import classdemo06.Mouse;
套件名稱 classdemo06 ,加上小數點,然後是個別的類別識別字。
雖然可以只寫一行 import classdemo06.* ,就表示引入 classdemo06 套件裡的所有類別,然而 Java 的寫程式習慣是使用哪一個類別,就引入那一個類別,這也是 Android Studio 自動載入的預設模式。
其他程式碼與 ClassDemo06.java 相同,因此執行結果也相同
哈囉,我是動物 |
哈囉,我是大象 |
哈囉,我是老鼠 |
接下來我們在進入軟體開發之前,把焦點放回 static 這個關鍵字上。
相關教學影片
中英文術語對照 | |
---|---|
class | 類別 |
field | 屬性 |
inheritance | 繼承 |
interface | 介面 |
member | 成員 |
method | 方法 |
package | 套件 |
重點整理 |
---|
1. 定義介面使用關鍵字 interface ,介面為類別的共通規格,類別可以實作多個介面。 |
2. 宣告套件使用關鍵字 package ,套件是 Java 組織程式庫的方式,相同套件中的類別不需要額外 import 就可以直接使用。 |
問題與討論 |
---|
1. 為什麼類別只能繼承單一父類別,卻能實作多個介面? |
2. 如果在相同專案中的程式屬於不同套件,那要怎麼使用各自的類別? |
練習 |
---|
1. 建立一個新專案 Exercise1101 ,設計 Animal 介面,裡頭宣告 speak() 方法與屬性 name ,並在 Exercise1101 類別實作 Animal 介面。 |
2. 建立一個新專案 Exercise1102 ,加入 Exercise1002 的幾個動物類別,不改變他們原本的套件名稱,然後在 Exercise1102 類別使用這幾個動物類別。 |