封裝java
封裝(Encapsulation)是指將對象的狀態信息隱藏在對象內部,不容許外部程序直接訪問對象內部信息,而是經過該類提供的方法來實現對內部信息的操做和訪問。編程
封裝是面向對象編程語言對客觀世界的模擬,客觀世界裏的Field都是杯隱藏在對象內部的,外界沒法直接操做和修改。(個人我的理解就是:比如一我的,這我的具備年齡,身高,體重等屬性,年齡只能隨着時間流逝增長,不能你說多少歲就是多少歲。)對一個類或對象實現良好的封裝,能夠實現如下目的:安全
》隱藏類的實現細節。編程語言
》讓使用者只能經過事先預約的方法來訪問數據,從而能夠在該方法里加入控制邏輯,限制對Field的不合理訪問。this
》可進行數據檢查,從而有利於保證對象信息的完整性。code
》便於修改,提升代碼的可維護性。對象
爲了實現良好的封裝,須要從兩方面考慮。get
》將對象的Field和實現細節隱藏起來,不容許外部直接訪問。io
》把方法暴露出來,讓方法來控制對這些Field進行安全的訪問和操做。編譯
封裝實際上有兩個方面的含義:把該隱藏的隱藏起來,把該暴露出來的暴露出來。這就須要經過使用java提供的訪問控制符來實現。
使用訪問控制符
java提供了4種訪問控制符:private,default,protected和public. 分別表明了4個訪問級別。
private(當前類訪問權限) ,default(包訪問權限),protected(子類訪問權限),public(公共訪問權限)。注:我比較懶,不想寫後面的,這方面看了知道就能夠了。
public class Person { //將Field使用private修飾,將這些Field隱藏起來 private String name; private int age; //提供方法來操做name Field public void setName(String name) { //執行合理性校驗,要求用戶名必須在2~8位之間 if (name.length()>8||name.length()<2) { System.out.println("您設置的任命不符合要求"); return; } else { this.name = name; } } public String getName() { return this.name; } //提供方法來操做age Field public void setAge(int age) { //執行合理性校驗,要求用戶年齡必須在0~100之間 if (age>100||age<0) { System.out.println("您設置的年齡不合法"); return; } else { this.age = age; } } public int getAge() { return this.age; } }
下面程序在main方法中建立一個Person對象,並嘗試操做和訪問該對象的age和name兩個Field。
public class PersonTest { public static void main(String[]args) { Person p = new Person(); //由於age Field已經被隱藏,因此下面的語句將出現編譯錯誤 //p.age = 1000; //下面語句編譯不會出現錯誤,但運行時將提示「您設置的年齡不合法」 //程序不會修改p的age Field p.setAge(1000); //訪問p的age Field也必須經過其對應的getting方法 //由於上面從未成功設置p的age Field,故此處輸出0 System.out.println("未設置age Field時:"+ p.getAge()); //成功修改p的age Field p.setAge(30); System.out.println("成功設置age Field後:"+ p.getAge()); //設置名字的方法和年齡類似 p.setName("夏幸運"); System.out.println("成功設置name Field後:"+ p.getName()); } }
關於訪問控制符的使用,存在幾條基本原則。
》類裏的絕大部分Field都應該使用private修飾,只有一些static修飾的,相似全局變量的Field,纔可能考慮使用public修飾。
》若是某個類主要是用作其餘類的父類,該類裏包含的大部分方法可能僅但願被其子類重寫,而不想被外界直接調用,則應該使用protected修飾這些方法。
》但願暴露出來給其餘類自由調用的方法應該使用public修飾。