Java基礎(chǔ)第四篇 封裝與接口
前言:
總結(jié)之前的內(nèi)容,對象(object
)指代某一事物,類(class)指代象的類型。對象可以有狀態(tài)和動作,即數(shù)據(jù)成員和方法。
到現(xiàn)在為止,數(shù)據(jù)成員和方法都是同時開放給內(nèi)部和外部的。在對象內(nèi)部,我們利用this
來調(diào)用對象的數(shù)據(jù)成員和方法。在對象外部,比如當(dāng)我們在另一個類中調(diào)用對象的時,可以使用 對象
.數(shù)據(jù)成員
和 對象
.方法()
來調(diào)用對象的數(shù)據(jù)成員和方法。
1、封裝與接口
封裝(encapsulation)是計算機常見的術(shù)語,即保留有限的外部接口(interface),
隱藏具體實施細節(jié)。比如在Linux架構(gòu),就可以看到Linux操作系統(tǒng)封裝了底層硬件的具體細節(jié),只保留了系統(tǒng)調(diào)用這一套接口。用戶處在封裝的外部,只能通過接口,進行所需的操作。
封裝在生活中很常見。比如下面是一個充電電筒:
一個用戶即使不看說明書,也可以猜到這個電筒的操作: 開關(guān)和充電。這個電筒用一個塑料殼將用戶不需要接觸的內(nèi)部細節(jié)隱藏起來,只保留了兩個接口,開關(guān)和電插頭。使用這兩個接口,用戶足以使用該產(chǎn)品在設(shè)計中想要實現(xiàn)的功能。如果所有的細節(jié)都同時暴露給用戶,那么用戶會對產(chǎn)品感到不知所措 (比如下面不加殼的遙控器)。因此,封裝提高了產(chǎn)品的易用性
。
如果產(chǎn)品不封裝,電筒或者遙控器的許多細節(jié)會暴露在用戶面前: 電池、電路、密封的橡膠等等。盡管這可以讓用戶更自由的對產(chǎn)品實施操作,比如直接給電池放電,取出一個LED燈等等。然而,用戶往往要承擔(dān)更大的損壞產(chǎn)品的風(fēng)險。因此,封裝提高了產(chǎn)品的安全性
。
一個Java軟件產(chǎn)品與一個日常產(chǎn)品相同。一個對象內(nèi)部可以有許多成員(數(shù)據(jù)成員和方法)。有一些數(shù)據(jù)成員和方法只是內(nèi)部使用。這時,我們會希望有一個給對象“加殼”的機制,從而封裝對象。這樣,用戶可以比較容易學(xué)習(xí)和使用外部的接口,而不必接觸內(nèi)部成員。
2、對象成員的封裝
Java通過三個關(guān)鍵字來控制對象的成員的外部可見性(visibility
): public
, private
, protected
。
- public: 該成員外部可見,即該成員為接口的一部分
- private: 該成員外部不可見,只能用于內(nèi)部使用,無法從外部訪問。
(protected涉及繼承的概念,放在以后說)
我們先來封裝以前定義的Human類:
public class Test { public static void main(String[] args) { Human aPerson = new Human(160); System.out.println(aPerson.getHeight()); aPerson.growHeight(170); System.out.println(aPerson.getHeight()); aPerson.repeatBreath(100); } } class Human { /** * constructor */ public Human(int h) { this.height = h; System.out.println("I'm born"); } /** * accessor */ public int getHeight() { return this.height; } /** * mutator */ public void growHeight(int h) { this.height = this.height + h; } /** * encapsulated, for internal use */ private void breath() { System.out.println("hu...hu..."); } /** * call breath() */ public void repeatBreath(int rep) { int i; for(i = 0; i < rep; i++) { this.breath(); } } private int height; // encapsulated, for internal use }
內(nèi)部方法并不受封裝的影響。Human
的內(nèi)部方法可以調(diào)用任意成員,即使是設(shè)置為private
的height
和breath
()
外部方法只能調(diào)用public
成員。當(dāng)我們在Human
外部時,比如Test
中,我們只能調(diào)用Human
中規(guī)定為public
的成員,而不能調(diào)用規(guī)定為private
的成員。
通過封裝,Human類就只保留了下面幾個方法作為接口:
- getHeight()
- growHeight()
- repBreath()
我們可以將Human類及其接口表示為如下圖的形式:
上圖就如“加了殼的遙控器”
如果我們從main
中強行調(diào)用height
:
System.out.println(aPerson.height);
將會有如下錯誤提示:
Test.java:6: height has private access in Human System.out.println(aPerson.height); ^ 1 error
Beep, 你觸電了! 一個被說明為private
的成員,不能被外部調(diào)用。
在Java的通常規(guī)范中,表達狀態(tài)的數(shù)據(jù)成員
(比如height)要設(shè)置成private
。對數(shù)據(jù)成員的修改要通過接口提供的方法進行(比如getHeight()和growHeight())。這個規(guī)范起到了保護數(shù)據(jù)的作用。用戶不能直接修改數(shù)據(jù),必須通過相應(yīng)的方法才能讀取和寫入數(shù)據(jù)。類的設(shè)計者可以在接口方法中加入數(shù)據(jù)的使用規(guī)范。
3、類的封裝
在一個.java文件中,有且只能有一個類帶有public
關(guān)鍵字,比如上面的Test
類。所以,從任意其他類中,我們都可以直接調(diào)用該類。Human
類沒有關(guān)鍵字。更早之前,我們對象的成員也沒有關(guān)鍵字。這種沒有關(guān)鍵字的情況也代表了一種可見性,我將在包(package
)的講解中深入。
4、總結(jié)
封裝,接口
private, public
到此這篇關(guān)于Java基礎(chǔ) 第四篇 封裝與接口的文章就介紹到這了,更多相關(guān)Java 的封裝與接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?restTemplate發(fā)送get請求query參數(shù)傳遞問題解決
這篇文章主要為大家介紹了Java?restTemplate發(fā)送get請求query參數(shù)傳遞問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11java初學(xué)者如何讓編程學(xué)習(xí)起來更簡單
我們給大家?guī)硪黄P(guān)于java初學(xué)者如何讓編程學(xué)習(xí)起來更簡單的基礎(chǔ)性文章,有需要的朋友們可以學(xué)習(xí)下。2020-11-11java將XML文檔轉(zhuǎn)換成json格式數(shù)據(jù)的示例
本篇文章主要介紹了java將XML文檔轉(zhuǎn)換成json格式數(shù)據(jù)的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12Spring Validation方法實現(xiàn)原理分析
這篇文章主要介紹了Spring Validation實現(xiàn)原理分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException的錯誤問題
這篇文章主要介紹了IDEA 中使用 ECJ 編譯出現(xiàn) java.lang.IllegalArgumentException問題 ,本文內(nèi)容簡短給大家介紹的好,需要的朋友可以參考下2020-05-05