鍍金池/ 教程/ Java/ 理解 Java 的三大特性之封裝
Java 集合細節(jié)(四):保持 compareTo 和 equals 同步
Iterator
使用序列化實現(xiàn)對象的拷貝
fail-fast 機制
關(guān)鍵字 final
Vector
HashTable
Java 集合細節(jié)(一):請為集合指定初始容量
強制類型轉(zhuǎn)換
數(shù)組之一:認識 JAVA 數(shù)組
Java 集合細節(jié)(三):subList 的缺陷
hashCode
ArrayList
數(shù)組之二
List 總結(jié)
LinkedList
Java 提高篇(九)—–實現(xiàn)多重繼承
Java 的四舍五入
關(guān)鍵字 static
理解 Java 的三大特性之多態(tài)
抽象類與接口
集合大家族
異常(二)
Java 集合細節(jié)(二):asList 的缺陷
Map 總結(jié)
TreeSet
equals() 方法總結(jié)
Java 提高篇(十)—–詳解匿名內(nèi)部類
HashMap
Stack
詳解內(nèi)部類
TreeMap
異常(一)
詳解 Java 定時任務(wù)
HashSet
字符串
理解 Java 的三大特性之繼承
理解 Java 的三大特性之封裝
代碼塊

理解 Java 的三大特性之封裝

從大二接觸 Java 開始,到現(xiàn)在也差不多三個年頭了。從最基礎(chǔ)的 HTML、CSS 到最后的 SSH 自己都是一步一個腳印走出來的,其中開心過、失落過、寂寞過。雖然是半道出家但是經(jīng)過自己的努力也算是完成了“學(xué)業(yè)”。期間參加過培訓(xùn)機構(gòu),但是極其不喜歡那種培訓(xùn)方式,于是毅然的放棄了選擇自學(xué)(可憐我出了6000塊錢啊),雖然自學(xué)途中苦很多,但是樂更多,當(dāng)中的付出和收獲只有自己知道。黃天不負有心人,鄙人愚鈍,在大四第一學(xué)期終于自學(xué)完成 Java (其中走了彎路,荒廢半年),并且憑借它得到了一份不錯的工作,不勝感激!

閑話過多!進入正題,LZ 最近剛剛看完設(shè)計模式,感觸良多。而且在工作過程中深感 Java 基礎(chǔ)不夠扎實,例如 IO 不熟、垃圾回收不知所云、多態(tài)七竅通五竅、反射不知、甚至連最基本的三大特性都搞得我迷糊了!所以我發(fā)狠心一定要好好彌補 Java 基礎(chǔ)!從第一課開始—封裝!!!!!!

三大特性之—封裝

封裝從字面上來理解就是包裝的意思,專業(yè)點就是信息隱藏,是指利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起,使其構(gòu)成一個不可分割的獨立實體,數(shù)據(jù)被保護在抽象數(shù)據(jù)類型的內(nèi)部,盡可能地隱藏內(nèi)部的細節(jié),只保留一些對外接口使之與外部發(fā)生聯(lián)系。系統(tǒng)的其他對象只能通過包裹在數(shù)據(jù)外面的已經(jīng)授權(quán)的操作來與這個封裝的對象進行交流和交互。也就是說用戶是無需知道對象內(nèi)部的細節(jié)(當(dāng)然也無從知道),但可以通過該對象對外的提供的接口來訪問該對象。

對于封裝而言,一個對象它所封裝的是自己的屬性和方法,所以它是不需要依賴其他對象就可以完成自己的操作。

使用封裝有三大好處:

 1、良好的封裝能夠減少耦合。

 2、類內(nèi)部的結(jié)構(gòu)可以自由修改。

 3、可以對成員進行更精確的控制。

 4、隱藏信息,實現(xiàn)細節(jié)。

首先我們先來看兩個類:Husband.java、Wife.java


    public class Husband {
        /*
         * 對屬性的封裝
         * 一個人的姓名、性別、年齡、妻子都是這個人的私有屬性
         */
        private String name ;
        private String sex ;
        private int age ;
        private Wife wife;

        /*
         * setter()、getter()是該對象對外開發(fā)的接口
         */
        public String getName() {
           return name;
       }

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

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public int getAge() {
            return age;
        }

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

        public void setWife(Wife wife) {
            this.wife = wife;
        }    
    }

    public class Wife {
        private String name;
        private int age;
        private String sex;
        private Husband husband;

        public String getName() {
            return name;
        }

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

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

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

        public void setHusband(Husband husband) {
            this.husband = husband;
        }

        public Husband getHusband() {
            return husband;
        }

    }

從上面兩個實例我們可以看出 Husband 里面 wife 引用是沒有 getter() 的,同時 wife 的 age 也是沒有 getter() 方法的。至于理由我想各位都懂的,男人嘛深屋藏嬌妻嘛,沒有那個女人愿意別人知道她的年齡。

所以封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性的方法,如果不想被外界方法,我們大可不必提供方法給外界訪問。但是如果一個類沒有提供給外界訪問的方法,那么這個類也沒有什么意義了。比如我們將一個房子看做是一個對象,里面的漂亮的裝飾,如沙發(fā)、電視劇、空調(diào)、茶桌等等都是該房子的私有屬性,但是如果我們沒有那些墻遮擋,是不是別人就會一覽無余呢?沒有一點兒隱私!就是存在那個遮擋的墻,我們既能夠有自己的隱私而且我們可以隨意的更改里面的擺設(shè)而不會影響到其他的。但是如果沒有門窗,一個包裹的嚴(yán)嚴(yán)實實的黑盒子,又有什么存在的意義呢?所以通過門窗別人也能夠看到里面的風(fēng)景。所以說門窗就是房子對象留給外界訪問的接口。

通過這個我們還不能真正體會封裝的好處?,F(xiàn)在我們從程序的角度來分析封裝帶來的好處。如果我們不使用封裝,那么該對象就沒有 setter() 和 getter(),那么 Husband 類應(yīng)該這樣寫:


    public class Husband {
        public String name ;
        public String sex ;
        public int age ;
        public Wife wife;
    }

我們應(yīng)該這樣來使用它:


    Husband husband = new Husband();
            husband.age = 30;
            husband.name = "張三";
            husband.sex = "男";    //貌似有點兒多余

但是那天如果我們需要修改 Husband,例如將 age 修改為 String 類型的呢?你只有一處使用了這個類還好,如果你有幾十個甚至上百個這樣地方,你是不是要改到崩潰。如果使用了封裝,我們完全可以不需要做任何修改,只需要稍微改變下 Husband 類的 setAge() 方法即可。


    public class Husband {

        /*
         * 對屬性的封裝
         * 一個人的姓名、性別、年齡、妻子都是這個人的私有屬性
         */
        private String name ;
        private String sex ;
        private String age ;    /* 改成 String類型的*/
        private Wife wife;

        public String getAge() {
            return age;
        }

        public void setAge(int age) {
            //轉(zhuǎn)換即可
            this.age = String.valueOf(age);
        }

        /** 省略其他屬性的setter、getter **/

    } 

其他的地方依然那樣引用 (husband.setAge(22)) 保持不變。

到了這里我們確實可以看出,封裝確實可以使我們?nèi)菀椎匦薷念惖膬?nèi)部實現(xiàn),而無需修改使用了該類的客戶代碼。

我們在看這個好處:可以對成員變量進行更精確的控制。

還是那個 Husband,一般來說我們在引用這個對象的時候是不容易出錯的,但是有時你迷糊了,寫成了這樣:


    Husband husband = new Husband();
            husband.age = 300;

也許你是因為粗心寫成了,你發(fā)現(xiàn)了還好,如果沒有發(fā)現(xiàn)那就麻煩大了,逼近誰見過300歲的老妖怪??!

但是使用封裝我們就可以避免這個問題,我們對 age 的訪問入口做一些控制 (setter) 如:


    public class Husband {

        /*
         * 對屬性的封裝
         * 一個人的姓名、性別、年齡、妻子都是這個人的私有屬性
         */
        private String name ;
        private String sex ;
        private int age ;    /* 改成 String類型的*/
        private Wife wife;

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            if(age > 120){
                System.out.println("ERROR:error age input....");    //提示錯誤信息
            }else{
                this.age = age;
            }

        }

        /** 省略其他屬性的setter、getter **/

    }

上面都是對 setter 方法的控制,其實通過使用封裝我們也能夠?qū)ο蟮某隹谧龀龊芎玫目刂?。例如性別我們在數(shù)據(jù)庫中一般都是已1、0方式來存儲的,但是在前臺我們又不能展示1、0,這里我們只需要在 getter() 方法里面做一些轉(zhuǎn)換即可。


    public String getSexName() {
            if("0".equals(sex)){
                sexName = "女";
            }
            else if("1".equals(sex)){
                sexName = "男";
            }
            else{
                sexName = "人妖???";
            }
            return sexName;
        }

在使用的時候我們只需要使用 sexName 即可實現(xiàn)正確的性別顯示。同理也可以用于針對不同的狀態(tài)做出不同的操作。


    public String getCzHTML(){
            if("1".equals(zt)){
                czHTML = "<a href='javascript:void(0)' onclick='qy("+id+")'>啟用</a>";
            }
            else{
                czHTML = "<a href='javascript:void(0)' onclick='jy("+id+")'>禁用</a>";
            }
            return czHTML;
        }

鄙人才疏學(xué)淺,只能領(lǐng)悟這么多了,如果文中有錯誤之處,望指正,鄙人不勝感激!

吐槽

宅了三天今天就出去走走,在公交車上遇到一極品美女!我坐著,一美女上車,站在我旁邊,開始還好,過了一會兒她就對我笑,笑笑還好,但是你也不能總對著人家笑吧!笑的我都不好意了(鄙人臉皮薄,容易害羞??)。難道是我沒有洗臉?照照鏡子蠻干凈的啊!難道是我衣服又或者褲子沒**,看來衣服褲子蠻好的!難道是我?guī)?,對我有意思?程序員屌絲一枚,貌似沒可能)!實在受不了了,哥想惹不起我還躲不起么?哥下車!我一下車,那枚美女就飛速的占我座位!哥當(dāng)時就憋出一個字:靠?。。。。。。。?/p>