Java 淺析三大特性之一封裝

在說Java 三個特性之前,我們先了解一下什么是面向?qū)ο?,以及為什么Java是面向?qū)ο蟮恼Z言。
面向?qū)ο笫菂^(qū)別于面向過程的一種編程的思想。我們可以通過這個例子冰箱裝大象的例子來了解一下面向?qū)ο笈c面向過程的區(qū)別。
想必通過這個例子,應(yīng)該清楚了面向?qū)ο笈c面向過程的區(qū)別。 面向過程是指我們主要注重于每一階段的過程,而面向?qū)ο笫侵肝覀冎饕⒅孛恳粋€動作的執(zhí)行者。Java就是注重于動作的執(zhí)行者,注重于編寫類,注重于代碼和功能復用的語言。

封裝

上面我們已經(jīng)說到了Java是注重于類的編寫,那么封裝自然也是對類的封裝。對類封裝有很多好處。

  1. 可以徹底隱藏方法的內(nèi)部實現(xiàn),僅僅提供一個調(diào)用的方法給其他人,讓其他使用這個類的人不需要關(guān)心是如何實現(xiàn)的,只要知道該如何調(diào)用就行。
  2. 隱藏方法的內(nèi)部實現(xiàn)的好處,可以讓保留調(diào)用方法不變的同時,隨意修改類的結(jié)構(gòu),而不影響其他人運行結(jié)果。
  3. 封裝還會分開類的屬性,將類的屬性分成私有屬性和公共屬性。私有屬性僅供類自身調(diào)用,和公共屬性也僅提供一個供外部調(diào)用的方法。
  4. 按照軟件的術(shù)語,良好的封裝是能夠減少耦合。

如何對一個類進行封裝,則需要根據(jù)這個類本身的客觀屬性與實際的需要。
比如一個MyTime類

public class MyTime{
    public String date;
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設(shè)置日期格式
    date= df.format(new Date());
    public String getDate() {
        return date;
    }

//
//    public void setDate(String date) {
//        this.date = date;
//    }
}

顯然這個類是只提供了顯示系統(tǒng)的時間,不提供外部去修改系統(tǒng)時間的方法。這個也是根據(jù)類本身的客觀屬性而言,時間是固有不會人為改變的屬性,當然諸如此類的例子,還有很多。我們只是簡單舉例來表明我們該如何設(shè)計類的外部訪問方法。

訪問權(quán)限

在上面的代碼中,我們已經(jīng)看到可以調(diào)用getData()方法對date進行訪問,但是date的修飾符是public ,換句話說,我們完全可以new 一個MyTime對象對date屬性進行修改和讀值,這就違背了我們封裝的初衷。所以,Java引入了不同的訪問權(quán)限來限定這件事情。在《Java編程思想》中講解了下述的訪問權(quán)限
public:接口訪問權(quán)限。也就是說public修飾的成員方法,屬性都是可以在任何地方所訪問的。
private: 你無法訪問 。也就說private修飾的成員方法,屬性 都是只能在這個類中被訪問,出了這個類以外的地方,你是無法訪問到這個類里面的內(nèi)容,這十分的有用,我們上面的例子代碼,因為是public修飾,所以會出現(xiàn)封裝不徹底的問題,如果我們的成員變量date用private修飾,那么就會不出現(xiàn)上述的問題。
protected: 繼承訪問權(quán)限。在說到繼承訪問權(quán)限之前,我們思考這樣一個問題,我們有一個基類,是需要被繼承的?;愔械某蓡T屬性,我們是希望能被繼承的類所訪問,那么我們是可以把他設(shè)定成public,但是一旦這樣的話,除了這個繼承的類,其他類也會訪問到。這個顯然不是我們所期望的事情,所以Java引入protected修飾符,來表示所修飾的部分是能被派生的類所訪問的,同時他也能被同一包里面的其他類所訪問。
所以,總結(jié)一下,如果我們是希望類中的方法和屬性能被所有類所訪問,就用public,如果只是能被繼承的類和同一包內(nèi)的類所訪問就用protected,如果只是希望在當前類中所訪問,不能被其他任何類訪問就要用private。

總結(jié)

在了解了封裝的具體含義和好處之后,我們就可以利用上面的訪問權(quán)限來對我們要向封裝的東西進行封裝,通過訪問權(quán)限來隱藏具體的實現(xiàn),和提供外部訪問的接口。

public class Student {
    private String name;
    private String age;

    private String handleName(String name){
       return "I'm " + name;
    }

    private String handleAge(String age) {
        return age + " 歲";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = handleName(name);
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = handleAge(age);
    }
}

在上面的例子中,我們對Student類進行了簡單的封裝,首先我們切斷了外部直接調(diào)用到name,age的可能,通過set和get方法來提供訪問到name,age的方法,同時,上面的例子中也體現(xiàn)出來了,在外部訪問方法不變的情況下,自己隨意修改內(nèi)部的實現(xiàn),我們首先編寫了只供類內(nèi)部調(diào)用的Handle的方法,用Handle方法來修改name,age的顯示結(jié)果。這樣確保了修改顯示結(jié)果的方法只能自己調(diào)用,而且在外部訪問不變的情況下,根據(jù)需求修改內(nèi)部的實現(xiàn)。這也是一個簡單的封裝例子。其調(diào)用的例子如下:student對象只能調(diào)用如下的內(nèi)容,其他我們自己編寫的內(nèi)容是無法調(diào)用的。

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("byhieg");
        student.setAge("23");
        System.out.println(student.getName() + " " + student.getAge());
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容