你好!讓我們將今天的課程專門用於封裝,並立即開始示例 :)這是一個普通的汽水機。我有一個問題要問你:它是如何運作的?盡量提供詳細的回答:杯子是從哪裡來的,內部溫度是如何保持的,冰是儲存在哪裡的,機器是怎麼知道加哪種糖漿的等等?你可能沒有這些問題的答案。很公平,因為不是每個人都使用這樣的機器。他們現在不那麼受歡迎了。讓我們再舉一個例子。您每天肯定會多次使用的東西。哦,這是一個主意!告訴我們Google 搜索引擎如何作品。它究竟如何搜索與您輸入的詞相關的信息?為什麼某些結果排名靠前而不是其他結果?即使您每天都使用 Google,您也有可能不知道。不過沒關係。你不需要知道這個。您可以在搜索引擎中輸入查詢,而無需考慮它是如何工作的。您可以從機器上購買蘇打水,而不知道它是如何工作的。你可以在不了解內燃機工作原理的情況下駕駛汽車,甚至完全不了解物理學,即使在小學階段也是如此。由於面向對象編程的主要原則之一:封裝,這一切成為可能. 閱讀有關面向對象編程 (OOP) 的各種文章,您一定已經了解到編程涉及兩個常見概念:封裝和隱藏。作者使用“封裝”一詞來表示一件事,然後再表示另一件事。我們將探討這兩個術語,以便您獲得完整的理解。在編程中,封裝的原始含義是將數據以及操作該數據的方法捆綁到一個單元(即“膠囊”)中。在Java中,類是封裝的單位。一個類包含數據(字段)和處理這些數據的方法。這對您來說似乎是明顯正確的方法,但在其他編程範例中,一切安排都不同。例如,在函數式編程中,數據與其操作嚴格分開。在 OOP 中,程序由膠囊或類組成,其中包含數據和處理該數據的函數。現在讓我們談談隱藏。我們如何在不了解它們的組織方式或工作方式的情況下使用各種複雜的設備?很簡單:他們的創造者為我們提供了一個簡單方便的界面. 在汽水機上,界面是面板上的按鈕。按下一個按鈕,您就可以選擇罩杯尺寸。按另一個,你選擇口味。第三個負責加冰。這就是您需要做的全部。機器的內部組織並不重要。重要的是它的設計方式要求用戶按下三個按鈕才能獲得蘇打水。汽車也是如此。裡面發生了什麼並不重要。重要的是,當你踩右踏板時,汽車向前行駛,而當你踩左踏板時,它會減速. 這就是隱藏的意義。程序的所有“內部”都對用戶隱藏。對於用戶來說,這是多餘的、不必要的信息。用戶需要最終結果,而不是內部過程。讓我們
Auto
以類為例:
public class Auto {
public void go() {
/* Some complicated things happen inside the car.
As a result, it moves forward */
}
public void brake() {
/* Some complicated things happen inside the car.
As a result, it slows down. */
}
public static void main(String[] args) {
Auto auto = new Auto();
// From the user's perspective,
// one pedal is pressed and the car accelerates.
auto.gas();
// The other is pressed, and the car slows down.
auto.brake();
}
}
下面是 Java 程序中實現隱藏的樣子。就像在現實生活中一樣:為用戶提供了一個接口(方法)。如果用戶需要程序中的汽車來執行操作,他或她只需調用所需的方法即可。這些方法內部發生的事情是多餘的。重要的是一切正常。這裡我們說的是實現隱藏。除此之外,Java還有數據隱藏。我們在關於 getters 和 setters 的課程中寫到了這一點,但複習一下這個概念也沒什麼壞處。比如我們有一個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;
}
也許您可以密切關注您的同事是否創建了具有無效狀態的對象,但最好排除創建此類“無效對象”的可能性。以下機制幫助我們實現數據隱藏:
- 訪問修飾符(private,protected,package default)
- 吸氣劑和吸氣劑
- 控制對象的正確狀態。上面有這樣的例子。setter 和 private 修飾符確保我們的程序不會有重量為 0 的貓。
- 通過界面實現用戶友好性。只有方法被“暴露”給外界。調用方法足以得到結果——完全沒有必要深入研究它們如何工作的細節。
- 代碼更改不會影響用戶。我們在方法內部進行任何和所有更改。這不會影響該方法的用戶:如果正確的代碼之前是“auto.gas()”以應用油門踏板,那麼它將繼續如此。事實上,我們在 gas() 方法內部進行了一些更改,這對用戶來說仍然是不可見的:和以前一樣,調用者只是接收到所需的結果。
GO TO FULL VERSION