摘要:封裝概述封裝是指隱藏對象的屬性和實現(xiàn)細節(jié),僅對外提供公共訪問方式這是什么意思呢簡單的來說就是我將不想給別人看的數(shù)據(jù),以及別人無需知道的內(nèi)部細節(jié),鎖起來,我們只留下一些入口,使其與外部發(fā)生聯(lián)系。
封裝概述:
封裝是指隱藏對象的屬性和實現(xiàn)細節(jié),僅對外提供公共訪問方式
這是什么意思呢?
簡單的來說就是我將不想給別人看的數(shù)據(jù),以及別人無需知道的內(nèi)部細節(jié), “鎖起來” ,我們只留下一些入口,使其與外部發(fā)生聯(lián)系。
我們?nèi)绾谓o我們的數(shù)據(jù) “上鎖” 呢?
我們使用,public、private、protected 等權(quán)限修飾符 在類的內(nèi)部設(shè)定了邊界,這些不同程度的 ”鎖“ 決定了緊跟其后被定義的東西能夠被誰使用。
封裝的好處:· 隱藏實現(xiàn)細節(jié),提供公共的訪問方式
· 提高了代碼的復用性
· 提高安全性
封裝好處的體現(xiàn)方式: (一)隱藏實現(xiàn)細節(jié),提供公共的訪問方式隱藏實現(xiàn)細節(jié)怎么理解呢?
我們將一些功能封裝到類中,而客戶端的程序員,不需要知道類中的這個方法的邏輯原理,類程序員只需要給他一個對外的接口,客戶端程序員只需要能夠調(diào)用這個方法即可,
例如:夏天宿舍很熱,我們(用戶)只需要操作遙控器即可使用空調(diào),并不需要了解空調(diào)內(nèi)部是如何運行的
提供公共的訪問方式又怎么理解呢?
我們先來看一段標準案例
public class Student { //定義成私有成員變量(private) private String name; private int age; //無參構(gòu)造 public Student() { super(); } //帶參構(gòu)造 public Student(String name, int age) { super(); this.name = name; this.age = age; } //成員變量的set和get方法(與外界聯(lián)系的橋梁) 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) { //創(chuàng)建學生類對象 s Student s = new Student(); //對象s調(diào)用類中的公共方法setName()和setAge() //set方法給成員變量賦值 s.setName("BWH_Steven"); s.setAge(20); //get方法獲取成員變量 System.out.println(s.getName() + s.getAge()); } }
我們可以看到在上面的案例中,成員變量都使用private修飾,而下面的get和set方法均使用了public修飾,其實被private修飾的屬性就是我們想要鎖起來的數(shù)據(jù),而set、get方法就是我們打開這把鎖的鑰匙
被private所修飾的內(nèi)容是,除類型創(chuàng)建者和類型的內(nèi)部方法之外的任何人都不能訪問的元素,所以我們這些數(shù)據(jù)就被我們通過private “鎖” 了起來,而我們外界是可以通過創(chuàng)建對象來調(diào)用一個類中的公共方法的,所以被public修飾的 set和get方法外界所能訪問的,而這兩個方法又可以直接訪問我們的私有成員變量,所以set和get方法就成為了私有成員與外界溝通的鑰匙。
(二)提高了代碼的復用性功能被封裝成了類,通過基類與派生類之間的一些機制(組合和繼承),來提高代碼的復用性
Ps:關(guān)于代碼復用問題,我會專篇講解,今天還是著重講解封裝帶來的主要好處
(三)提高安全性看完上面的代碼,可能大家會有一點疑惑,這些屬性、方法封裝后我都還可以看得到,這哪里體現(xiàn)了安全呢?大家來一起看一看我們下面這個改進版的案例
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()方法中加入了校驗的內(nèi)容 //不合法數(shù)據(jù)是不允許傳遞給成員變量的 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來修飾我們的成員變量不是沒有任何依據(jù)的,如果我們的成員變量修飾符改為public,這句意味著外界可以使用對象直接訪問,修改這個成員變量,這可能會造成一些重大的問題
例如:外界通過對象去給成員變量賦值,可以賦值一些非法的數(shù)據(jù)
這明顯是不合理的。所以在賦值之前應(yīng)該先對數(shù)據(jù)進行判斷
StudenDemo是一個測試類,測試類一般只創(chuàng)建對象,調(diào)用方法
所以這個判斷應(yīng)該定義在Student類中。需要使用邏輯語句
邏輯語句應(yīng)該定義在方法中。所以在Student類中提供一個方法來對數(shù)據(jù)進行校驗
但是如果偏偏不調(diào)用方法來賦值,還是直接賦值,這樣我們的方法就沒有起作用
所以我們必須強制要求使用我的方法,而不能直接調(diào)用成員變量
這也正是我們使用private修飾成員變量的原因!
結(jié)尾:如果內(nèi)容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關(guān)注我吧!
在這里的我們素不相識,卻都在為了自己的夢而努力 ?一個堅持推送原創(chuàng)Java技術(shù)的公眾號:理想二旬不止
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74656.html
摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗,所以線程相關(guān)的問題在面試中經(jīng)常會被提到。將對象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對象稱之為反序列化。 JVM 內(nèi)存溢出實例 - 實戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細介紹 Java 注解的使用,有利于學習編譯時注解 Java 程序員快速上手 Kot...
摘要:一概述集合是引入的新的內(nèi)置對象類型,其特點同數(shù)學意義的集合,即集合內(nèi)所有元素不重復元素唯一。數(shù)組集合對比數(shù)組和集合,數(shù)組可以加入重復數(shù)據(jù),而集合的所有元素是唯一的不允許重復。因此,適合臨時存放一組對象,以及存放跟對象綁定的信息。 本文同步帶你入門 帶你入門 JavaScript ES6 (五) 集合,轉(zhuǎn)載請注明出處。 前面我們學習了: for of 變量和擴展語法 塊作用域變量和解構(gòu)...
閱讀 4758·2021-11-15 11:39
閱讀 2700·2021-11-11 16:55
閱讀 2208·2021-10-25 09:44
閱讀 3512·2021-09-22 16:02
閱讀 2444·2019-08-30 15:55
閱讀 3132·2019-08-30 13:46
閱讀 2674·2019-08-30 13:15
閱讀 1959·2019-08-30 11:12