Java全面分析面向?qū)ο笾庋b
什么是封裝呢
封裝就是一種將數(shù)據(jù)和操作數(shù)據(jù)的方法進行有機結(jié)合,一種函數(shù)抽象類的接口實現(xiàn)了對細節(jié)的封裝和隱藏,使得我們只需要調(diào)用對外開放的公共接口去實現(xiàn)與對象的交互。我們可以把封裝理解為一種保護的屏障,需要一些嚴格的接口進行控制,我們可以修改自己實現(xiàn)類的內(nèi)部結(jié)構(gòu)的代碼,但是不可以修改那些公共接口。這就提供更好的安全性。
封裝的好處意義
- 好的封裝能夠減少耦合度
- 能夠?qū)Τ蓡T變量更精準的控制
- 實現(xiàn)對細節(jié)的封裝和隱藏,使得更具有安全性。
- 可以修改類的內(nèi)部代碼,不用修改那些公共的接口
講到封裝那必然講到關(guān)鍵字private也就是訪問修飾限定符。
回憶一下我們見過哪些訪問修飾限定符呢?有public ,還有成員變量什么也不加的默認權(quán)限英文是default,還有就是我們今天要講解的private,下一篇文章會講解protected。
那private到底有什么用處呢?
我們在來回憶一下上篇文章講過的類和對象,下面我會創(chuàng)建一個學生類。
//創(chuàng)建一個學生類 class Student { public String name;//學生姓名 public int age;//學生年齡 public String sex;//學生性別 public double score;//學生分數(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)鍵字實例化一個對象 student.age = 19; student.name = "厚積薄發(fā)"; student.score = 99.9; student.sex = "男"; } }
以上的代碼我們將這個學生成員變量分別賦值。這樣寫會不會有什么不足呢?
想一想,如果我們每次要定義一個學生對象,每次都要這樣賦值會不會有點太麻煩?今天我們講到封裝就會讓它更簡單一些。請看下面代碼:
class Student { private String name;//學生姓名 private int age;//學生年齡 private String sex;//學生性別 private double score;//學生分數(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ù)封裝的概念我是不是可以給它封裝成一個公共的接口然后調(diào)用。
好接下來分析一下這個代碼:
所以,我們在成員變量前面加上private修飾使得成員變量只能在類的內(nèi)部訪問,不能在類的外部訪問,然后我們實現(xiàn)了setName getName方法,調(diào)用者兩個接口就可以進行初始化和返回值操作,更好地體現(xiàn)了封裝性。
getter方法和setter方法
為了更方便的調(diào)用這些接口,IDEA會為我們提供了這些接口,我們通常情況下把這些方法叫做getter方法和setter方法。只要我們需要我們就可以調(diào)用這些共有的getter方法和setter方法。
IDEA快捷鍵:Alt + insert
class Student { private String name;//學生姓名 private int age;//學生年齡 private String sex;//學生性別 private double score;//學生分數(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)鍵字實例化一個對象 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方法
此外,我們每個成員變量都要自己實現(xiàn)一遍打印操作,沒錯IDEA編譯器又為我們提供了一個方法,這個方法叫做toString方法,快捷鍵是 Alt +insert然后選擇toString方法。
我們直接打印對象的引用就可以調(diào)用toString方法.
有同學就會問為什么呢?
這就得需要我們看一看println的源碼是怎么實現(xiàn)的了。
我們按住ctrl 點進println這個方法
我們通過源碼就可以發(fā)現(xiàn),println會調(diào)用toString方法,如果定義了toString方法,那他就調(diào)用toString方法,如果沒有調(diào)用他就會打?。?/p>
eg:
其中IDEA還為我們提供了構(gòu)造方法,為了更好地方便初始化,構(gòu)造方法的文章請看這篇文章:
快捷鍵: Alt + insert 選擇constructor
總結(jié):
private關(guān)鍵字:利用private修飾的成員變量和方法只能在本類中訪問,如果在外部訪問可以調(diào)用公有的setter方法和getter方法。
封裝的優(yōu)點:減少代碼的耦合性 , 可以自由修改自己的內(nèi)部類,不用修改公有地接口 ,隱藏信息實現(xiàn)細節(jié),更精準的控制成員變量。
要記住并且運用并且調(diào)用這些公共的接口:getter方法和setter方法 還有toString方法 以及 構(gòu)造方法。
面向?qū)ο蠓庋b之包
包是什么呢?
包其實就是類似于文件夾,為了更好地管理。在java中引入包的概念,包的用處:如果一個包中的類不想被另外一個包中的類使用這就更好地體現(xiàn)了封裝性,還有一個作用就是,Java中不可以在src底下創(chuàng)建相同的類名,這一點包就可以解決,只要在不同的包中,類的名稱可以一樣。
怎么進行導包呢?
還記得我們在學習數(shù)組的時候使用過Arrays這個類,我們就要導入java.util包
例如:
當然我們還可以手動導入
這里還需要注意一個問題:
我們可以注意到在包中有java.util包也有java.sql包,當我們同時導入這兩個包,計算機就會反應(yīng)不過來到底導入哪個包
所以,當同時導入util包和sql包時候,我們需要手動導入具體是導入那一個包。
自定義包
一般包的名字都是域名倒著過來 例如 com.hjbf.TestDemo
我們上面文章講過訪問修飾限定符,有一個是默認訪問權(quán)限(default)其實也叫作包訪問權(quán)限,如果成員變量前邊什么也不加那就是默認訪問權(quán)限也叫作包訪問權(quán)限只能夠在同一包中使用。
這里我們要注意一下我們創(chuàng)建一個包,他就會導入這個包,其中packge是聲明在包中,后面的就是路徑。
我們可不可以在這個包里訪問其他包呢?
答案是可以的,當我們訪問其他包時候,他就會在本包中導入其他的包。
包的基本規(guī)則:
- 在文件的最上方加上一個 package 語句指定該代碼在哪個包中.
- 包名需要盡量指定成唯一的名字, 通常會用公司的域名的顛倒形式(例如 com.bit.demo1 ).
- 包名要和代碼路徑相匹配. 例如創(chuàng)建 com.bit.demo1 的包, 那么會存在一個對應(yīng)的路徑 com/bit/demo1 來存儲代碼.
- 如果一個類沒有 package 語句, 則該類被放到一個默認包中.
常見的包分類:
1. java.lang:系統(tǒng)常用基礎(chǔ)類(String、Object),此包從JDK1.1后自動導入。
2. java.lang.reflect:java 反射編程包;
3. java.net:進行網(wǎng)絡(luò)編程開發(fā)包。
4. java.sql:進行數(shù)據(jù)庫開發(fā)的支持包。
5. java.util:是java提供的工具程序包。(集合類等) 非常重要
6. java.io:I/O編程開發(fā)包
到此這篇關(guān)于Java全面分析面向?qū)ο笾庋b的文章就介紹到這了,更多相關(guān)Java封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java CountDownLatch計數(shù)器與CyclicBarrier循環(huán)屏障
CountDownLatch是一種同步輔助,允許一個或多個線程等待其他線程中正在執(zhí)行的操作的ASET完成。它允許一組線程同時等待到達一個共同的障礙點2023-04-04SpringCloud微服務(wù)架構(gòu)實戰(zhàn)之微服務(wù)治理功能的實現(xiàn)
這篇文章主要介紹了SpringCloud微服務(wù)架構(gòu)實戰(zhàn)之微服務(wù)治理,這些治理工具主要包括服務(wù)的注冊與發(fā)現(xiàn)、負載均衡管理、動態(tài)路由、服務(wù)降級和故障轉(zhuǎn)移、鏈路跟蹤、服務(wù)監(jiān)控等,需要的朋友可以參考下2022-02-02Java優(yōu)先隊列(PriorityQueue)重寫compare操作
這篇文章主要介紹了Java優(yōu)先隊列(PriorityQueue)重寫compare操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10jmeter壓力測試工具簡介_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了jmeter壓力測試工具相關(guān)介紹資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08Java如何實現(xiàn)支付寶電腦支付基于servlet版本
這篇文章主要介紹了Java如何實現(xiàn)支付寶電腦支付基于servlet版本,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11Idea2020.2創(chuàng)建JavaWeb項目(部署Tomcat)方法詳解
這篇文章主要介紹了Idea2020.2創(chuàng)建JavaWeb項目(部署Tomcat)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08使用LambdaQueryWrapper動態(tài)加過濾條件?動態(tài)Lambda
這篇文章主要介紹了使用LambdaQueryWrapper動態(tài)加過濾條件?動態(tài)Lambda,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01Hystrix?Turbine聚合監(jiān)控的實現(xiàn)詳解
微服務(wù)架構(gòu)下,?個微服務(wù)往往部署多個實例,如果每次只能查看單個實例的監(jiān)控,就需要經(jīng)常切換很不?便,在這樣的場景下,我們可以使??Hystrix?Turbine?進?聚合監(jiān)控,它可以把相關(guān)微服務(wù)的監(jiān)控數(shù)據(jù)聚合在?起,便于查看2022-09-09