封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式java
這是什麼意思呢?程序員
簡單的來講就是我將不想給別人看的數據,以及別人無需知道的內部細節, 「鎖起來」 ,咱們只留下一些入口,使其與外部發生聯繫。安全
咱們如何給咱們的數據 「上鎖」 呢?測試
咱們使用,public、private、protected 等權限修飾符 在類的內部設定了邊界,這些不一樣程度的 」鎖「 決定了緊跟其後被定義的東西可以被誰使用。this
· 隱藏實現細節,提供公共的訪問方式code
· 提升了代碼的複用性對象
· 提升安全性blog
隱藏實現細節怎麼理解呢?繼承
咱們將一些功能封裝到類中,而客戶端的程序員,不須要知道類中的這個方法的邏輯原理,類程序員只須要給他一個對外的接口,客戶端程序員只須要可以調用這個方法便可,接口
例如:夏天宿舍很熱,咱們(用戶)只須要操做遙控器便可使用空調,並不須要瞭解空調內部是如何運行的
提供公共的訪問方式又怎麼理解呢?
咱們先來看一段標準案例
public class Student { //定義成私有成員變量(private) private String name; private int age; //無參構造 public Student() { super(); } //帶參構造 public Student(String name, int age) { super(); this.name = name; this.age = age; } //成員變量的set和get方法(與外界聯繫的橋樑) public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }
public class StudentDemo { public static void main(String[] args) { //建立學生類對象 s Student s = new Student(); //對象s調用類中的公共方法setName()和setAge() //set方法給成員變量賦值 s.setName("BWH_Steven"); s.setAge(20); //get方法獲取成員變量 System.out.println(s.getName() + s.getAge()); } }
咱們能夠看到在上面的案例中,成員變量都使用private修飾,而下面的get和set方法均使用了public修飾,其實被private修飾的屬性就是咱們想要鎖起來的數據,而set、get方法就是咱們打開這把鎖的鑰匙
被private所修飾的內容是,除類型建立者和類型的內部方法以外的任何人都不能訪問的元素,因此咱們這些數據就被咱們經過private 「鎖」 了起來,而咱們外界是能夠經過建立對象來調用一個類中的公共方法的,因此被public修飾的 set和get方法外界所能訪問的,而這兩個方法又能夠直接訪問咱們的私有成員變量,因此set和get方法就成爲了私有成員與外界溝通的鑰匙。
功能被封裝成了類,經過基類與派生類之間的一些機制(組合和繼承),來提升代碼的複用性
Ps:關於代碼複用問題,我會專篇講解,今天仍是着重講解封裝帶來的主要好處
看完上面的代碼,可能你們會有一點疑惑,這些屬性、方法封裝後我都還能夠看獲得,這哪裏體現了安全呢?你們來一塊兒看一看咱們下面這個改進版的案例
public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } //在setAge()方法中加入了校驗的內容 //不合法數據是不容許傳遞給成員變量的 public void setAge(int age) { if (age < 0 || age > 120) { System.out.println("Error"); }else { this.age = age; } } public int getAge() { return age; } }
public class StudentDemo { public static void main(String[] args) { Student s = new Student(); System.out.println(s.getName() + s.getAge()); //錯誤的方式!!! s.name = "BWH_Steven"; s.age = 20; System.out.println(s.getName() + s.getAge()); //正確的方式!!! s.setName("BWH_Steven"); s.setAge(20); } }
咱們用private來修飾咱們的成員變量不是沒有任何依據的,若是咱們的成員變量修飾符改成public,這句意味着外界可使用對象直接訪問,修改這個成員變量,這可能會形成一些重大的問題
例如:外界經過對象去給成員變量賦值,能夠賦值一些非法的數據
這明顯是不合理的。因此在賦值以前應該先對數據進行判斷
StudenDemo是一個測試類,測試類通常只建立對象,調用方法
因此這個判斷應該定義在Student類中。須要使用邏輯語句
邏輯語句應該定義在方法中。因此在Student類中提供一個方法來對數據進行校驗
可是若是恰恰不調用方法來賦值,仍是直接賦值,這樣咱們的方法就沒有起做用
因此咱們必須強制要求使用個人方法,而不能直接調用成員變量
這也正是咱們使用private修飾成員變量的緣由!
若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^
若是能幫到你的話,那就來關注我吧!
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤
一個堅持推送原創Java技術的公衆號:理想二旬不止