跳至內容

Java/封裝

維基教科書,自由的教學讀本

封裝是物件導向程序設計四大基本概念之一,其餘三個分別是繼承,多態和抽象。

封裝是一種可以使類中的欄位私有並能通過公有方法來訪問私有欄位的技術。如果一個欄位被聲明為私有,它就不能在類的外部被訪問,從而隱藏了類內部的欄位。基於這個原因,封裝有時也被稱為數據隱藏。

封裝可以被認為是一種能夠保護代碼和數據被定義在類外的其它代碼任意訪問的屏障。訪問數據和代碼由一個接口嚴格控制。 封裝的主要好處是修改我們實現的代碼而又不會破壞其他人使用我們的代碼。封裝的這個特性使我們的代碼具有可維護性、靈活性以及擴展性。

封裝類中的屬性或方法

封裝屬性:

private 属性类型 属性名

封裝方法:

private 方法返回类型 方法名称参数

示例:

/* File name : EncapTest.java */
public class EncapTest{
    private String name;
    private String idNum;
    private int age;
    public int getAge(){
        return age;
    }
    public String getName(){
        return name;
    }
    public String getIdNum(){
        return idNum;
    }
    public void setAge(int newAge){
        age = newAge;
    }
    public void setName(String newName){
            name = newName;
    }
    public void setIdNum(String newId){
        idNum = newId;
    }
}

公有方法是從類外訪問到類內欄位的入口。通常情況下,這些方法被定義為 getters 和 setters 。因此想要訪問類內變量的任何其他類要使用 getters 和 setters 方法。

EncapTest 類的變量可以像如下的方式訪問:

/* File name : RunEncap.java */
public class RunEncap{
    public static void main(String args[]){
        EncapTest encap = new EncapTest();
        encap.setName("James");
        encap.setAge(20);
        encap.setIdNum("12343ms");
        System.out.println("Name : " + encap.getName());
        System.out.println("Age : "+ encap.getAge());
    }
}

結果:

Name : James
Age : 20

到底什麼時候需要封裝,什麼時候不用封裝?關於封裝與否並沒有一個明確的規定,不過從程序設計角度來說,一般說來設計較好的程序的類中的屬性都是需要封裝的。此時,要設置或取得屬性值,則只能用 setXxx()、getXxx()方法,這是一個明確且標準的規定。


封裝的優點

• 類中的欄位可以被設置為只讀或只寫。

• 類可以完全控制它欄位裡面所存儲的東西。

• 類的使用者不用知道類是如何存儲數據的。類可以改變欄位的數據類型而類的使用者不需要改變任何之前的