Java 入門指南

單元 11 - 介面與套件

~~學習進度表~~

定義介面 (interface) 使用關鍵字 interface ,套件 (package) 則用關鍵字 package

interface, 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.javaElephant.javaMouse.java 複製到這個資料夾中

Animal.javaElephant.javaMouse.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 這個關鍵字上。

相關教學影片

上一頁 單元 10 - 物件導向程式設計
回 Java 入門指南首頁
下一頁 單元 12 - static
回 Java 教材首頁
回程式語言教材首頁
中英文術語對照
class類別
field屬性
inheritance繼承
interface介面
member成員
method方法
package套件
參考資料
1. The Java™ Tutorials: What Is an Interface?
2. The Java™ Tutorials: What Is a Package?
3. The Java™ Tutorials: Interfaces
4. The Java™ Tutorials: Defining an Interface
5. The Java™ Tutorials: Implementing an Interface
6. The Java™ Tutorials: Using an Interface as a Type
7. The Java™ Tutorials: Evolving Interfaces
8. The Java™ Tutorials: Default Methods
9. The Java™ Tutorials: Creating and Using Packages
10. The Java™ Tutorials: Creating a Package
11. The Java™ Tutorials: Naming a Package
12. The Java™ Tutorials: Using Package Members
13. The Java™ Tutorials: Managing Source and Class Files
重點整理
1. 定義介面使用關鍵字 interface ,介面為類別的共通規格,類別可以實作多個介面。
2. 宣告套件使用關鍵字 package ,套件是 Java 組織程式庫的方式,相同套件中的類別不需要額外 import 就可以直接使用。
問題與討論
1. 為什麼類別只能繼承單一父類別,卻能實作多個介面?
2. 如果在相同專案中的程式屬於不同套件,那要怎麼使用各自的類別?
練習
1. 建立一個新專案 Exercise1101 ,設計 Animal 介面,裡頭宣告 speak() 方法與屬性 name ,並在 Exercise1101 類別實作 Animal 介面。
2. 建立一個新專案 Exercise1102 ,加入 Exercise1002 的幾個動物類別,不改變他們原本的套件名稱,然後在 Exercise1102 類別使用這幾個動物類別。