夯實Java基礎(二)——面向對象之封裝

一、封裝介紹

封裝封裝,見名知意,就是把東西包裝隱藏起來,不被外界所看見,安全

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

類的某些信息隱藏在類的內部,不容許外部程序直接訪問,而是經過該類提供的方法來對隱藏的信息向外暴露來進行操做和訪問。this

封裝的好處(優勢):spa

  1. 良好的封裝可以增長內聚減小耦合。
  2. 經過隱藏對象的屬性來保護對象內部的狀態,方便修改和實現。(隱藏信息、實現細節)。
  3. 提升了代碼的可用性和可維護性,由於對象的行爲能夠被單獨的改變或者是擴展(將變化隔離,類內部的結構能夠自由修改,增長內部實現部分的可替換性)。
  4. 禁止對象之間的不良交互提升模塊化(良好的封裝可以減小耦合)。
  5. 能夠對成員變量進行更精確的控制。
  6. 容易保證類內部數據間的一致性,從而提升軟件的可靠性。

提到Java的封裝,那麼確定離不開四種權限修飾:code

修飾符 同類中 同一個包中(子類和無關類) 不一樣包(子類) 不一樣包(無關類)
public   √         √     √     √
protected   √         √     √  
default   √         √    
private   √      

 

 

 

 

 

 

 

二、封裝的引入

首先咱們先來看一下下面的這個Person類。對象

public class Person {
    public String name;//姓名
    public int age;//年齡
    public String sex;//性別

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

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

從上面的Person類能夠看到,他的全部屬性都是用public修飾的,這就好像你的姓名,年齡,性別都是寫在臉上的,都暴露了出來,要是這個類有更多的屬性,如身份證、電話號碼、家庭住址這種比較私密的屬性暴露在外面那就不安全了,這就是沒有封裝的弊端。blog

咱們建立一個Person實例給他賦值:接口

Person person=new Person();
person.name="菜徐坤";
person.age=21;
person.sex="woman";

若是咱們哪天要修改屬性的類型了,例如將age的類型修改成String類型的,若是你只有一處使用了這個還好,若是你有幾十個甚至上百個這樣地方,你是否是要改到崩潰。若是使用了封裝,咱們徹底能夠不須要作任何修改,只須要稍微改變下Person類的setAge()方法便可。ci

三、封裝的使用

若是使用了封裝,咱們來看應該怎麼操做。get

public class Person {
    private String name;//姓名
    private String age;//年齡,age數據類型改爲String了
    private String sex;//性別

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
    /**省略其餘getter和setter方法**/
}

使用封裝以後,就不能再用Person類的實例來調用其屬性了,會提示該屬性是私有化的,不能調用,這樣就保證了屬性的隱蔽性。咱們會提供屬性public的getter和setter方法來對屬性進行操做。

前面講到修改age的數據類型,若是使用的封裝,其餘類使用的person.setAge(21)都不須要改變,只需修改Person類中數據類型和getter、setter方法便可。

若是你將年齡設置成 person.setAge(500),你會發現也能夠,可是這就不和常理了,人怎麼可能活500歲,使用封裝咱們可以輕鬆解決這樣的問題。咱們只需在setAge方法裏面添加一些條件便可,以下所示。

public class Person {
    private String name;//姓名
    private int age;//年齡
    private String sex;//性別

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age>256){
            System.out.println("你輸入的年齡有誤!");
        }else{
            this.age = age; 
        }
    }
    /** 省略其餘屬性的setter、getter **/
}
相關文章
相關標籤/搜索