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