Java基礎-封裝與接口

一、封裝

1、什么是封裝?

在一個對象中,包含了狀態和行為,狀態指的是對象的數據成員,而行為則對應了對象的方法。數據成員和方法都是提供給內部和外部使用的,內部通過this調用對象的數據成員和方法,在外部另一個類中則通過 對象.數據成員對象.方法()來調用對象的數據成員和方法。

將要封裝的對象成員(數據成員和方法),只允許從外部調用部分成員

2、封裝的作用

封裝的作用是提高對象的易用性和安全性。

譬如,一個充電電筒:

圖1? 充電電筒

一個用戶即使不看說明書,也可以猜到這個電筒的操作: 開關和充電。這個電筒用一個塑料殼將用戶不需要接觸的內部細節隱藏起來,只保留了兩個接口,開關和電插頭。使用這兩個接口,用戶足以使用該產品在設計中想要實現的功能。如果所有的細節都同時暴露給用戶,那么用戶會對產品感到不知所措 (比如下面不加殼的遙控器)。因此,封裝提高了產品的易用性

對于Java來說,若不對數據成員和方法進行封裝,面對茫茫多的數據成員時,我們在需要用到幾個數據成員的組合值時,這里的數據成員就相當于手電筒的內部部件,數據成員的組合值,就相當于手電筒的內部部件組合成的開關功能,當我們需要這個組合值的時候,直接調用就可以了,而不是還要我們在外部一個一個成員數值組起來再構成那個組合值的功能。你看,要是我們封裝起來了,是不是更容易使用了?

圖2? 遙控器

對于安全性來說,這里我們用遙控器打比方,如果產品不封裝,遙控器的許多細節會暴露在用戶面前: 電池、電路、密封的橡膠等等。盡管這可以讓用戶更自由的對產品實施操作,比如直接給電池放電,取出一個LED燈等等。然而,用戶往往要承擔更大的損壞產品的風險。因此,封裝提高了產品的安全性

同樣,對于Java,譬如有3個參數,int a,int b,int c,而a=b/c,若我們沒有對其封裝,沒有對c進行判斷不能為0,當我們運行程序時,輸入c=0時,就會產生異常。當一個類的數據成員直接暴露給外部使用,在外部使用人員不了解或者惡意破壞的情況下,就有可能產生不可預想的后果,這里也就體現了封裝的安全性。


對象成員的封裝

Java通過三個關鍵字來控制對象的成員的外部可見性(visibility):public,private,protected。

這里我們主要講public 和 private 這兩個關鍵字。

public: 該成員外部可見,即該成員為接口的一部分

private: 該成員外部不可見,只能用于內部使用,無法從外部訪問。

我們先來封裝以前定義的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

}

內部方法并不受封裝的影響。Human的內部方法可以調用任意成員,即使是設置為private的height和breath()

外部方法只能調用public成員。當我們在Human外部時,比如Test中,我們只能調用Human中規定為public的成員,而不能調用規定為private的成員。

通過封裝,Human類就只保留了下面幾個方法作為接口:

getHeight()

growHeight()

repBreath()

我們可以將Human類及其接口表示為如下圖的形式:

圖3? 封裝了的Human

如果我們從main中強行調用height:


System.out.println(aPerson.height);

將會有如下錯誤提示:

Test.java:6: height has private access in Human

System.out.println(aPerson.height);

^

1 error

Beep, 你觸電了! 一個被說明為private的成員,不能被外部調用。

在Java的通常規范中,表達狀態的數據成員(比如height)要設置成private。對數據成員的修改要通過接口提供的方法進行(比如getHeight()和growHeight())。這個規范起到了保護數據的作用。用戶不能直接修改數據,必須通過相應的方法才能讀取和寫入數據。類的設計者可以在接口方法中加入數據的使用規范。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Win7下如何打開DOS控制臺? a:開始--所有程序--附件--命令提示符 b:開始--搜索程序和文件--cmd...
    逍遙嘆6閱讀 1,614評論 4 12
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • 七點多起來吃了早飯又睡過去,迷迷糊糊睡到中午12點才醒來,躺在床上,像個廢人一樣。 午飯母親又有局,躺在床上不想爬...
    南安怎么安閱讀 257評論 0 0
  • 五歲時,我和林昊一起上廁所,那時的幼兒園廁所男孩女孩不分。我指著他的小雞雞說:“這是什么?我怎么沒有?能拽下來嗎?...
    葉青辭閱讀 875評論 13 21