Java基礎04 封裝與介面

來源:互聯網
上載者:User

標籤:

總結之前的內容,對象(object)指代某一事物,類(class)指代象的類型。對象可以有狀態和動作,即資料成員和方法。

到現在為止,資料成員和方法都是同時開放給內部和外部的。在對象內部,我們利用this來調用對象的資料成員和方法。在對象外部,比如當我們在另一個類中調用對象的時,可以使用 對象.資料成員 和 對象.方法() 來調用對象的資料成員和方法。

我們將要封裝(encapsulation)對象的成員(成員包括資料成員和方法),從而只允許從外部調用部分的成員。利用封裝,我們可以提高對象的易用性和安全性。

 

封裝與介面

封裝(encapsulation)是電腦常見的術語,即保留有限的外部介面(interface),隱藏具體實施細節。比如在Linux架構,就可以看到Linux作業系統封裝了底層硬體的具體細節,只保留了系統調用這一套介面。使用者處在封裝的外部,只能通過介面,進行所需的操作。

 

封裝在生活中很常見。比如下面是一個充電電筒:

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

 

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

 

一個Java軟體產品與一個日常產品相同。一個對象內部可以有許多成員(資料成員和方法)。有一些資料成員和方法只是內部使用。這時,我們會希望有一個給對象“加殼”的機制,從而封裝對象。這樣,使用者可以比較容易學習和使用外部的介面,而不必接觸內部成員。

 

對象成員的封裝

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

  • public: 該成員外部可見,即該成員為介面的一部分
  • private: 該成員外部不可見,只能用於內部使用,無法從外部存取。

(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}
 

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

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

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

  • getHeight()
  • growHeight()
  • repBreath()

 

我們可以將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())。這個規範起到了保護資料的作用。使用者不能直接修改資料,必須通過相應的方法才能讀取和寫入資料。類的設計者可以在介面方法中加入資料的使用規範。

 

類的封裝

在一個.java檔案中,有且只能有一個類帶有public關鍵字,比如上面的Test類。所以,從任意其他類中,我們都可以直接調用該類。Human類沒有關鍵字。更早之前,我們對象的成員也沒有關鍵字。這種沒有關鍵字的情況也代表了一種可見度,我將在包(package)的講解中深入。

 

練習 封裝一個Torch類,來表示電筒。介面有開關和充電。內部的成員有電量。

 

總結

封裝,介面

private, public

Java基礎04 封裝與介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.