Java面向?qū)ο蟮姆庋b你了解嗎
面向?qū)ο笏枷胫庋b
或許大家都聽說過java是純面向?qū)ο笳Z言,面向?qū)ο笏枷胍簿褪俏覀兂Uf的OOP,我們聽說最多的思想就是繼承,封裝,多態(tài),今天我們來講一講封裝。
什么是封裝呢?
封裝就是一種將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,一種函數(shù)抽象類的接口實(shí)現(xiàn)了對(duì)細(xì)節(jié)的封裝和隱藏,使得我們只需要調(diào)用對(duì)外開放的公共接口去實(shí)現(xiàn)與對(duì)象的交互。我們可以把封裝理解為一種保護(hù)的屏障,需要一些嚴(yán)格的接口進(jìn)行控制,我們可以修改自己實(shí)現(xiàn)類的內(nèi)部結(jié)構(gòu)的代碼,但是不可以修改那些公共接口。這就提供更好的安全性。
封裝的好處意義
- 好的封裝能夠減少耦合度
- 能夠?qū)Τ蓡T變量更精準(zhǔn)的控制
- 實(shí)現(xiàn)對(duì)細(xì)節(jié)的封裝和隱藏,使得更具有安全性。
- 可以修改類的內(nèi)部代碼,不用修改那些公共的接口
講到封裝那必然講到關(guān)鍵字private也就是訪問修飾限定符。
回憶一下我們見過哪些訪問修飾限定符呢?有public ,還有成員變量什么也不加的默認(rèn)權(quán)限英文是default,還有就是我們今天要講解的private,下一篇文章會(huì)講解protected。
那private到底有什么用處呢?
我們?cè)趤砘貞浺幌律掀恼轮v過的類和對(duì)象,下面我會(huì)創(chuàng)建一個(gè)學(xué)生類。
//創(chuàng)建一個(gè)學(xué)生類 class Student { public String name;//學(xué)生姓名 public int age;//學(xué)生年齡 public String sex;//學(xué)生性別 public double score;//學(xué)生分?jǐn)?shù) public void sleep() { System.out.println("我要睡覺了?。?!"); } public void eat() { System.out.println("我要干飯了?。。?); } public void exam() { System.out.println("我要考試了?。?!"); } } public class TestDemo { public static void main(String[] args) { Student student = new Student();//利用new關(guān)鍵字實(shí)例化一個(gè)對(duì)象 student.age = 19; student.name = "厚積薄發(fā)"; student.score = 99.9; student.sex = "男"; } }
以上的代碼我們將這個(gè)學(xué)生成員變量分別賦值。這樣寫會(huì)不會(huì)有什么不足呢?
想一想,如果我們每次要定義一個(gè)學(xué)生對(duì)象,每次都要這樣賦值會(huì)不會(huì)有點(diǎn)太麻煩?今天我們講到封裝就會(huì)讓它更簡單一些。請(qǐng)看下面代碼:
class Student { private String name;//學(xué)生姓名 private int age;//學(xué)生年齡 private String sex;//學(xué)生性別 private double score;//學(xué)生分?jǐn)?shù) public String getName() { return name; } public void setName(String name) { this.name = name; } } public class TestDemo { public static void main(String[] args) { Student student = new Student(); student.setName("厚積薄發(fā)"); System.out.println(student.getName()); } }
根據(jù)封裝的概念我是不是可以給它封裝成一個(gè)公共的接口然后調(diào)用。
好接下來分析一下這個(gè)代碼:
所以,我們?cè)诔蓡T變量前面加上private修飾使得成員變量只能在類的內(nèi)部訪問,不能在類的外部訪問,然后我們實(shí)現(xiàn)了setName getName方法,調(diào)用者兩個(gè)接口就可以進(jìn)行初始化和返回值操作,更好地體現(xiàn)了封裝性。
getter方法和setter方法
為了更方便的調(diào)用這些接口,IDEA會(huì)為我們提供了這些接口,我們通常情況下把這些方法叫做getter方法和setter方法。只要我們需要我們就可以調(diào)用這些共有的getter方法和setter方法。
IDEA快捷鍵:Alt + insert
class Student { private String name;//學(xué)生姓名 private int age;//學(xué)生年齡 private String sex;//學(xué)生性別 private double score;//學(xué)生分?jǐn)?shù) public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } public void sleep() { System.out.println("我要睡覺了?。?!"); } public void eat() { System.out.println("我要干飯了?。?!"); } public void exam() { System.out.println("我要考試了?。?!"); } } public class TestDemo { public static void main(String[] args) { Student student = new Student();//利用new關(guān)鍵字實(shí)例化一個(gè)對(duì)象 student.setName("厚積薄發(fā)"); student.setAge(19); student.setScore(99.9); student.setSex("male"); System.out.println(student.getName()); System.out.println(student.getAge()); System.out.println(student.getScore()); System.out.println(student.getSex()); } }
toString方法
此外,我們每個(gè)成員變量都要自己實(shí)現(xiàn)一遍打印操作,沒錯(cuò)IDEA編譯器又為我們提供了一個(gè)方法,這個(gè)方法叫做toString方法,快捷鍵是 Alt +insert然后選擇toString方法。
我們直接打印對(duì)象的引用就可以調(diào)用toString方法.
有同學(xué)就會(huì)問為什么呢?
這就得需要我們看一看println的源碼是怎么實(shí)現(xiàn)的了。
我們按住ctrl 點(diǎn)進(jìn)println這個(gè)方法
我們通過源碼就可以發(fā)現(xiàn),println會(huì)調(diào)用toString方法,如果定義了toString方法,那他就調(diào)用toString方法,如果沒有調(diào)用他就會(huì)打印:
eg:
快捷鍵: Alt + insert 選擇constructor
總結(jié):
private關(guān)鍵字:利用private修飾的成員變量和方法只能在本類中訪問,如果在外部訪問可以調(diào)用公有的setter方法和getter方法。
封裝的優(yōu)點(diǎn):減少代碼的耦合性 , 可以自由修改自己的內(nèi)部類,不用修改公有地接口 ,隱藏信息實(shí)現(xiàn)細(xì)節(jié),更精準(zhǔn)的控制成員變量。
要記住并且運(yùn)用并且調(diào)用這些公共的接口:getter方法和setter方法 還有toString方法以及 構(gòu)造方法。
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Hystrix?Turbine聚合監(jiān)控的實(shí)現(xiàn)詳解
微服務(wù)架構(gòu)下,?個(gè)微服務(wù)往往部署多個(gè)實(shí)例,如果每次只能查看單個(gè)實(shí)例的監(jiān)控,就需要經(jīng)常切換很不?便,在這樣的場(chǎng)景下,我們可以使??Hystrix?Turbine?進(jìn)?聚合監(jiān)控,它可以把相關(guān)微服務(wù)的監(jiān)控?cái)?shù)據(jù)聚合在?起,便于查看2022-09-09Java實(shí)現(xiàn)圖片旋轉(zhuǎn)、指定圖像大小和水平翻轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖像旋轉(zhuǎn),指定圖像大小,水平翻轉(zhuǎn)圖像,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02Java servlet 使用 PrintWriter 時(shí)的編碼與亂碼的示例代碼
本篇文章主要介紹了Java servlet 使用 PrintWriter 時(shí)的編碼與亂碼的示例代碼,探討了 PrintWriter 的缺省編碼與普通字符流的缺省編碼的差異,具有一定的參考價(jià)值,有興趣的可以了解一下2017-11-11springboot斷言異常封裝與統(tǒng)一異常處理實(shí)現(xiàn)代碼
異常處理其實(shí)一直都是項(xiàng)目開發(fā)中的大頭,但關(guān)注異常處理的人一直都特別少,下面這篇文章主要給大家介紹了關(guān)于springboot斷言異常封裝與統(tǒng)一異常處理的相關(guān)資料,需要的朋友可以參考下2023-01-01Java中CopyOnWriteArrayList的使用解析
這篇文章主要介紹了Java中CopyOnWriteArrayList的使用解析,CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫操作的場(chǎng)景里,比如緩存,它不存在擴(kuò)容的概念,每次寫操作都要復(fù)制一個(gè)副本,在副本的基礎(chǔ)上修改后改變Array引用,需要的朋友可以參考下2023-12-12Springmvc獲取前臺(tái)請(qǐng)求數(shù)據(jù)過程解析
這篇文章主要介紹了Springmvc獲取前臺(tái)請(qǐng)求數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07java中計(jì)算字符串長度的方法及u4E00與u9FBB的認(rèn)識(shí)
字符串采用unicode編碼的方式時(shí),計(jì)算字符串長度的方法找出UNICODE編碼中的漢字的代表的范圍“\u4E00” 到“\u9FBB”之間感興趣的朋友可以參考本文,或許對(duì)你有所幫助2013-01-01