CodeGym /Java Blog /Toto sisi /Java封裝
John Squirrels
等級 41
San Francisco

Java封裝

在 Toto sisi 群組發布
你好!我們將在今天的課程中專門介紹 Java 封裝,並從門外的示例開始:) 這裡有一個普通的汽水自動售貨機。我有一個問題要問你:它是如何運作的?盡量給出一個詳細的答案:汽水從哪裡來?內部溫度如何保持?冰儲存在哪裡?機器如何知道要添加哪種糖漿?你可能沒有這些問題的答案。好吧,也許不是每個人都使用這些機器。它們目前並不那麼受歡迎。讓我們試試另一個例子。您每天肯定會多次使用的東西。哦,我有個主意! 告訴我Google 搜索引擎封裝原理 - 2如何作品。它究竟如何搜索有關您輸入的字詞的信息?為什麼這些結果排在首位而不是其他?即使您每天都使用 Google,您也可能不知道。但這沒關係。畢竟,這不是您需要知道的事情。您可以使用搜索引擎而無需考慮其具體工作原理。您可以從一台機器上購買蘇打水,而不知道它是如何製造的。您無需深入研究內燃機的工作原理,甚至無需了解高中物理就可以駕駛汽車。由於面向對象編程的主要原則之一:封裝,這一切都是可能的。在閱讀有關該主題的不同文章時,您一定遇到過兩個廣泛使用的編程概念:封裝和信息隱藏。碰巧,不同的人理解“ 封裝'意味著不同的東西。我們將破譯這兩個術語,以便您有一個完整的理解。在編程中,封裝是將數據和處理該數據的方法組合在一個包(“膠囊”)中。在Java中,封裝包就是。該類包含數據(字段)和處理該數據的 方法。封裝原理 - 3這對您來說似乎是顯而易見的,但在其他編程範例中,一切安排都不同。例如,在函數式編程中,數據與數據操作是嚴格分開的。在面向對象編程 (OOP) 中,程序由膠囊(類)組成,膠囊(類)由數據和處理數據的函數組成。

現在讓我們談談信息隱藏

我們如何在不了解它們是如何構建或如何工作的情況下使用各種複雜的機制?很簡單:它們的創建者提供了簡單方便的界面。在汽水機上,界面是前面板上的按鈕。一鍵讓您選擇罩杯尺寸。您可以使用第二個按鈕選擇糖漿。第三個負責加冰。這就是您需要做的全部。機器內部的外觀並不重要。重要的是,它的設計讓用戶只需按三個按鈕就可以獲得蘇打水。同樣的事情也適用於汽車。裡面發生了什麼並不重要。重要的是,當您踩下右踏板時,汽車會前進,而當您踩下左踏板時,汽車會減速。這就是信息隱藏的本質。一個程序的全部' s“內臟”對用戶是隱藏的。這樣的信息對於用戶來說是多餘的或不必要的。用戶需要最終結果,而不是內部過程。例如,讓我們看一下車輛類別:

public class Vehicle {

   public void gas() {

       /* Some complicated things happen inside a car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside a car.
       As a result, it slows down */
   }

   public static void main(String[] args) {

       Vehicle vehicle = new Vehicle();

       // How everything looks to the user

       // Press one pedal, the car moves
       vehicle.gas();

       // Press the other pedal, the car brakes
       vehicle.brake();
   }
}
這就是實現隱藏在 Java 程序中的方式。就像在現實生活中一樣:為用戶提供了一個接口(方法)。在程序中,如果您需要汽車來執行某個動作,您只需調用所需的方法即可。這些方法內部發生的事情是多餘的。重要的是一切正常。這裡我們一直在談論實現隱藏。Java也有數據隱藏。我們在有關 getter 和 setter 的課程中寫過它,但提醒一下也無妨。例如,我們有一個Cat類:

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
也許您還記得上一節課上這門課的問題是什麼?如果沒有,讓我們回憶一下。問題是它的數據(字段)對所有人開放。另一個程序員可以輕鬆地創建一隻體重為 0、年齡為 -1000 歲的無名貓:

public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
在這種情況下,您可以仔細跟踪您的一位同事是否正在創建具有無效狀態的對象,但最好甚至消除創建這些無效對象的可能性。 封裝原理 - 4我們藉助以下方法實現數據隱藏:
  1. 訪問修飾符(private、protected、package default);
  2. 吸氣劑和吸氣劑。
我們用它們來檢查是否有人試圖給貓一個負年齡。 正如我們前面所說,關於封裝的各種文章的作者實際上指的是封裝(結合數據和方法)或信息隱藏,或兩者兼而有之。Java 有這兩種機制(這在其他 OOP 語言中不一定如此),所以最後一個選項是最正確的。

封裝給了我們幾個重要的優勢:

  1. 監視正確的對象狀態。我們在上面給出了這樣的例子:感謝 setter 和private修飾符,我們已經保護我們的程序免受權重為 0 的貓的攻擊。

  2. 用戶友好的界面。我們只將方法暴露給用戶。用戶只需調用它們即可獲得結果。並且沒有必要深入研究它們如何工作的細節。

  3. 代碼更改不會影響用戶。我們在方法內部進行所有更改。這不會影響用戶:他們編寫了vehicle.gas()來施加氣體,這就是他們將繼續做的事情。事實上,我們在gas()方法內部進行了一些更改,這仍然是不可見的:和以前一樣,它們只是獲得了所需的結果。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION