java提升篇(一)-----理解java的三大特性之封裝

      從大二接觸java開始,到如今也差很少三個年頭了。從最基礎的HTML、CSS到最後的SSH本身都是一步一個腳印走出來的,其中開心過、失落過、寂寞過。雖然是半道出家可是通過本身的努力也算是完成了「學業」。期間參加過培訓機構,可是極其不喜歡那種培訓方式,因而毅然的放棄了選擇自學(可憐我出了6000塊錢啊),雖然自學途中苦不少,可是樂更多,當中的付出和收穫只有本身知道。黃天不負有心人,鄙人愚鈍,在大四第一學期終於自學完成java(其中走了彎路,荒廢半年),而且憑藉它獲得了一份不錯的工做,不勝感激!javascript

      閒話過多!進入正題,LZ最近剛剛看完設計模式,感觸良多。並且在工做過程當中深感java基礎不夠紮實,例如IO不熟、垃圾回收不知所云、多態七竅通五竅、反射不知、甚至連最基本的三大特性都搞得我迷糊了!因此我發狠心必定要好好彌補java基礎!從第一課開始---封裝!!!!!!java

三大特性之---封裝

      封裝從字面上來理解就是包裝的意思,專業點就是信息隱藏,是指利用抽象數據類型將數據和基於數據的操做封裝在一塊兒,使其構成一個不可分割的獨立實體,數據被保護在抽象數據類型的內部,儘量地隱藏內部的細節,只保留一些對外接口使之與外部發生聯繫。系統的其餘對象只能經過包裹在數據外面的已經受權的操做來與這個封裝的對象進行交流和交互。也就是說用戶是無需知道對象內部的細節(固然也無從知道),但能夠經過該對象對外的提供的接口來訪問該對象。程序員

      對於封裝而言,一個對象它所封裝的是本身的屬性和方法,因此它是不須要依賴其餘對象就能夠完成本身的操做。數據庫

      使用封裝有三大好處:設計模式

         一、良好的封裝可以減小耦合。this

         二、類內部的結構能夠自由修改。spa

         三、能夠對成員進行更精確的控制。設計

         四、隱藏信息,實現細節。code

      首先咱們先來看兩個類:Husband.java、Wife.java對象

public class Husband {
    
    /*
     * 對屬性的封裝
     * 一我的的姓名、性別、年齡、妻子都是這我的的私有屬性
     */
    private String name ;
    private String sex ;
    private int age ;
    private Wife wife;
    
    /*
     * setter()、getter()是該對象對外開發的接口
     */
    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()方法的。至於理由我想各位都懂的,男人嘛深屋藏嬌妻嘛,沒有那個女人願意別人知道她的年齡。

      因此封裝把一個對象的屬性私有化,同時提供一些能夠被外界訪問的屬性的方法,若是不想被外界方法,咱們大可沒必要提供方法給外界訪問。可是若是一個類沒有提供給外界訪問的方法,那麼這個類也沒有什麼意義了。好比咱們將一個房子看作是一個對象,裏面的漂亮的裝飾,如沙發、電視劇、空調、茶桌等等都是該房子的私有屬性,可是若是咱們沒有那些牆遮擋,是否是別人就會盡收眼底呢?沒有一點兒隱私!就是存在那個遮擋的牆,咱們既可以有本身的隱私並且咱們能夠隨意的更改裏面的擺設而不會影響到其餘的。可是若是沒有門窗,一個包裹的嚴嚴實實的黑盒子,又有什麼存在的意義呢?因此經過門窗別人也可以看到裏面的風景。因此說門窗就是房子對象留給外界訪問的接口。

      經過這個咱們還不能真正體會封裝的好處。如今咱們從程序的角度來分析封裝帶來的好處。若是咱們不使用封裝,那麼該對象就沒有setter()和getter(),那麼Husband類應該這樣寫:

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

     咱們應該這樣來使用它:

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) {
        //轉換便可
        this.age = String.valueOf(age);
    }
    
    /** 省略其餘屬性的setter、getter **/
    
}

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

      到了這裏咱們確實能夠看出,封裝確實可使咱們容易地修改類的內部實現,而無需修改使用了該類的客戶代碼

      咱們在看這個好處:能夠對成員變量進行更精確的控制。

      仍是那個Husband,通常來講咱們在引用這個對象的時候是不容易出錯的,可是有時你迷糊了,寫成了這樣:

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

      也許你是由於粗心寫成了,你發現了還好,若是沒有發現那就麻煩大了,逼近誰見過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方法的控制,其實經過使用封裝咱們也可以對對象的出口作出很好的控制。例如性別咱們在數據庫中通常都是已一、0方式來存儲的,可是在前臺咱們又不能展現一、0,這裏咱們只須要在getter()方法裏面作一些轉換便可。

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

      在使用的時候咱們只須要使用sexName便可實現正確的性別顯示。同理也能夠用於針對不一樣的狀態作出不一樣的操做。

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;
    }

      鄙人才疏學淺,只能領悟這麼多了,若是文中有錯誤之處,望指正,鄙人不勝感激!

吐槽

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

相關文章
相關標籤/搜索