淺談java中面向對象思想——封裝。

 本人最近在學習java,java自己也是一門面向對象的語言,那麼先簡單來講說,何爲面向對象。
   何爲面向對象:編程語言分爲面向對象,和麪向過程,那麼何爲面向對象呢,我我的的理解就是,你須要什麼,就把相對應用來解決問題的類,拿過來用,而不用本身親歷親爲,對同類對象抽象出其共性,造成類。用這個你抽象出來的類,來解決你要解決事兒。
  面向對象三大特性,封裝、繼承、多態。java

一.封裝數據庫

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

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

       使用封裝有三大好處:學習

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

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

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

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

public class Teacher{  
      
    /* 
     * 對屬性的封裝 
     * 一我的的姓名、性別、年齡、學生都是這個老師的私有屬性 
     */  
    private String name ;  
    private String sex ;  
    private int age ;  
    private Student stu;  
      
    /* 
     * 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 int getStu() {  
        return stu;  
    }

    public void setStu(Student stu) {  
        this.stu = stu;  
    }
}
public class Student{  
    private String name;  
    private int age;  
    private String sex;  
    private Teacher teacher;  
  
    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 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 getAge() {  
        return husband;  
    }   
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public void setTeacher(Teacher teacher) {  
        this.teacher = teacher;  
    }  
  
    public Husband getTeacher() {  
        return teacher;  
    }  
      
}

從上面兩個類,咱們能夠看出,咱們將Teacher類和Student類的屬性設置爲私有,可是設置了相應的get方法供外界訪問,固然若是學生闖禍了,他不想讓別人知道他的老師是誰,這樣咱們只須要取消getTeacher方法就好。接口

因此封裝把一個對象的屬性私有化,同時提供一些能夠被外界訪問的屬性的方法,若是不想被外界方法,咱們大可沒必要提供方法給外界訪問。可是若是一個類沒有提供給外界訪問的方法,那麼這個類也就沒有意義了。(都不讓用你還封裝這個類幹嗎=。=)

固然,這樣可能還沒法知道封裝的好處,以及封裝的意義,那麼咱們能夠這樣。

public class Student{  
    private String name;  
    private int age;  
    private String sex;  
    private Teacher teacher;
}
public class Test{  
   public static void main(String[] args) {
		Student stu1 = new Student();
        stu1.age = 30;   
	}  
}

在上面的代碼中,學生類中的age屬性是int屬性,若是咱們想給它改爲String屬性怎麼辦呢?若是隻在這一個類裏面寫了還好,要是在幾百個類裏都有這個屬性,那怎麼辦呢?

這個時候封裝的好處就體現出來了,這個時候只要在Student類裏,作一點小的修改就能夠了。上代碼

/* 
     * 對屬性的封裝 
     * 一我的的姓名、性別、年齡、老師都是這個學生的私有屬性 
     */  
    private String name ;  
    private String sex ;  
    private String age ;    /* 改爲 String類型的*/   
      
    public String getAge() {  
        return age;  
    }  
      
    public void setAge(int age) {  
        //轉換便可  
        this.age = String.valueOf(age);  
    }  
      
    /** 省略其餘屬性的setter、getter **/

這個時候只要對,Student的set方法進行一個小的修改就能夠了。

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

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

      封裝的好處:能夠對成員變量進行精確的控制。

封裝還能夠在類的內部對一些屬性進行一些嚴謹的限制操做,好比性別這個屬性,咱們通常在數據庫中用1或0方式來存儲,只有男女,若是出現其餘的......

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

同理,名字,年齡,咱們均可以作一些相似的操做,或者在set方法裏作一些限制,這裏就不一一贅述了。

以上純屬我的觀點和理解,歡迎補充和指正,謝謝。請各位大大關注後續的一些博客,下一篇《繼承》。

相關文章
相關標籤/搜索