」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 什麼是封裝以及如何使用它。

什麼是封裝以及如何使用它。

發佈於2024-11-08
瀏覽:851

What is encapsulation and how to use it.

什麼是封裝?
Java 中的封裝就是隱藏某些東西如何運作的細節,同時仍然允許其他人使用它。您將資料(如變數)和方法(如函數)分組到一個單元中,稱為類別。您不是讓每個人都直接存取您的數據,而是提供方法(getter 和 setter)來控制數據的存取或更改方式。這樣,您可以保護您的資料並保持程式碼整潔和有條理,除非您願意,否則不會讓任何人弄亂內部工作。

如何使用
要在 Java 中使用封裝,您需要建立一個具有私有欄位的類,並提供公共方法(如 getter 和 setter)來存取和修改這些欄位。這確保了數據只能以受控方式更改。例如,如果要建立 Person 類,其中名稱和年齡是私有的,則可以使用 getter 來檢索值並使用 setter 來更新它們。具體方法如下:

public class Person {
    // Private fields
    private String name;
    private int age;

    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter for name
    public String getName() {
        return name;
    }

    // Setter for name
    public void setName(String name) {
        this.name = name;
    }

    // Getter for age
    public int getAge() {
        return age;
    }

    // Setter for age
    public void setAge(int age) {
        if(age > 0) { // Simple validation
            this.age = age;
        } else {
            System.out.println("Age must be positive.");
        }
    }
}

// Using the Person class
public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 25);

        // Accessing fields using getters
        System.out.println(person.getName()); // Output: John
        System.out.println(person.getAge());  // Output: 25

        // Modifying fields using setters
        person.setName("Jane");
        person.setAge(30);

        System.out.println(person.getName()); // Output: Jane
        System.out.println(person.getAge());  // Output: 30
    }
}

讓我們分解
讓我們分解程式碼並逐步解釋每個部分:

1. 帶有私有欄位的類別定義
public class Person {
    // Private fields
    private String name;
    private int age;
}

解釋:

這是 Person 類,我們在其中定義兩個私有欄位:name(字串)和age(int)。透過將這些欄位設為私有,我們確保沒有其他類別可以直接存取或修改它們。這就是封裝的核心思想──隱藏物件的內部狀態。

2.構造函數
    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

解釋:

建構函式在建立 Person 物件時會對其進行初始化。它需要兩個參數:姓名和年齡,並將這些值分配給私有欄位。這確保了當創建新的 Person 物件時,它以有效資料開始。

3. Getter 和 Setter
    // Getter for name
    public String getName() {
        return name;
    }

    // Setter for name
    public void setName(String name) {
        this.name = name;
    }

解釋:

建構函式在建立 Person 物件時會對其進行初始化。它需要兩個參數:姓名和年齡,並將這些值分配給私有欄位。這確保了當創建新的 Person 物件時,它以有效資料開始。

4.年齡的Getter和Setter(帶驗證)
    // Getter for age
    public int getAge() {
        return age;
    }

    // Setter for age
    public void setAge(int age) {
        if (age > 0) { // Simple validation
            this.age = age;
        } else {
            System.out.println("Age must be positive.");
        }
    }

解釋:

getter getAge() 的工作方式與 name 的 getAge() 的工作方式相同,允許存取年齡欄位。
setAge() 方法不僅允許修改年齡字段,還添加了驗證檢查。 if 條件確保僅當年齡為正數時才設定年齡。如果提供了無效的年齡(例如負數),則設定器將阻止更新並列印訊息。這是封裝如何讓您控制可以設定的資料類型的範例。

5. 使用 Person 類別
// Using the Person class
public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 25);

        // Accessing fields using getters
        System.out.println(person.getName()); // Output: John
        System.out.println(person.getAge());  // Output: 25

        // Modifying fields using setters
        person.setName("Jane");
        person.setAge(30);

        System.out.println(person.getName()); // Output: Jane
        System.out.println(person.getAge());  // Output: 30
    }
}

解釋:

在本節中,我們使用建構函式建立一個Person物件(person)。建構函數將初始名稱設定為“John”,年齡設定為 25。

然後,我們使用 getter(getName() 和 getAge())來列印 name 和age 的值。之後,我們使用 setter(setName() 和 setAge())來更新值。最後,再次使用 getter 列印更新後的值。

封裝實務要點:

  • 資料保護:

    私有欄位不能從類別外部直接存取或修改。

  • 受控存取:

    取得器和設定器提供了存取和修改私人欄位的受控方式。

  • 驗證:

    年齡的設定器示範如何強制執行規則(例如,年齡必須為正)以保護資料免受無效輸入的影響。

版本聲明 本文轉載於:https://dev.to/ife_oluwa/what-is-encapsulation-and-how-to-use-it-207d?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Python 中的實例方法與類別方法:什麼時候應該使用“self”和“cls”?
    Python 中的實例方法與類別方法:什麼時候應該使用“self”和“cls”?
    深入研究類別和實例方法的細微差別:Beyond Self 與ClsPython 增強提案(PEP) 8 建議使用“self”作為實例方法中的第一個參數,「cls」作為類別方法中的第一個參數。這種差異源自於這些方法在處理實例和類別時所扮演的不同角色。 實例方法:自我優勢實例方法在實例的實例上呼叫班級。...
    程式設計 發佈於2024-11-09
  • 在 Python 中使用 bytes(n) 時,與數位轉換的主要差異是什麼?
    在 Python 中使用 bytes(n) 時,與數位轉換的主要差異是什麼?
    Python 中的位元組物件:超越數位轉換在Python 中使用位元組物件時,必須了解bytes(n) 是如何轉換的函數與數值轉換不同。將整數 n 傳遞給 bytes(n) 不會傳回 n 的二進位表示形式,而是建立一個長度為 n 且填入有空位元組 (\x00) 的位元組字串。 行為背後的基本原則此行...
    程式設計 發佈於2024-11-09
  • 如何使用 Docker 部署 Go 應用程式
    如何使用 Docker 部署 Go 應用程式
    Docker is a containerization platform that simplifies applications’ packaging, distribution, and deployment. You can harness the benefits of Go and Do...
    程式設計 發佈於2024-11-09
  • 如何在 MySQL 中將紀元時間戳轉換為人類可讀的日期?
    如何在 MySQL 中將紀元時間戳轉換為人類可讀的日期?
    在 MySQL 中將紀元時間戳轉換為人類可讀的日期在 MySQL 中,紀元時間戳是日期和時間的數字表示形式。它是自 Unix 紀元(即 1970 年 1 月 1 日 00:00:00 UTC)以來的毫秒數。 要將紀元時間戳轉換為人類可讀的日期,您可以使用 from_unixtime( ) 功能。函數...
    程式設計 發佈於2024-11-09
  • 如何使用 Pip 取得可用軟體包版本清單:綜合指南
    如何使用 Pip 取得可用軟體包版本清單:綜合指南
    如何使用Pip 取得可用套件版本清單:綜合指南Pip 是一個廣泛使用的Python 套件安裝程序,提供了一個安裝和管理Python 套件的有效方法。雖然它允許方便地安裝特定的軟體包版本,但在選擇最佳版本之前可能有必要探索所有可能版本的綜合清單。本文深入探討如何在各種 pip 版本中實現此目的。 Pi...
    程式設計 發佈於2024-11-09
  • ## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **
    ## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **
    std::vector 迭代器失效:詳細解釋std::vector 中迭代器失效的概念經常被討論。需要澄清的是,透過 std::vector::erase 擦除向量元素會使嚴格位於已擦除元素之後的迭代器無效。 但是,位於已擦除元素的確切位置的迭代器的有效性仍然不確定。從邏輯上講,人們可能會假設該迭代...
    程式設計 發佈於2024-11-09
  • Python 開發人員如何增強調試技術以獲得更有效率的程式碼?
    Python 開發人員如何增強調試技術以獲得更有效率的程式碼?
    Python 中增強的調試技術增強 Python 中的調試過程對於尋求優化程式碼的開發人員至關重要。以下是一些幫助您完成此任務的寶貴提示:利用 PDB 模組PDB(Python 調試器)模組提供了全面的調試環境。透過將 pdb.set_trace() 整合到程式碼中,您可以在特定位置建立斷點。這個靈...
    程式設計 發佈於2024-11-09
  • AdaBoost - 整合方法,分類:監督機器學習
    AdaBoost - 整合方法,分類:監督機器學習
    Boosting Definition and Purpose Boosting is an ensemble learning technique used in machine learning to improve the accuracy of models...
    程式設計 發佈於2024-11-09
  • 重新學習CS基礎知識-實作佇列
    重新學習CS基礎知識-實作佇列
    你曾經站在隊列中嗎,隊列資料結構也做同樣的事情。當你想在你最喜歡的自助餐廳點餐時,你站在隊伍的最後,然後你就可以繼續排隊並離開。 CS 中的佇列資料結構執行相同的功能。佇列資料結構是先進先出的資料結構。佇列資料結構可以使用兩個基本函數 Enqueue 和 Dequeue 來構建,這兩個函數基本上是...
    程式設計 發佈於2024-11-09
  • 為 Angular 18 設定 linter 和 IDE
    為 Angular 18 設定 linter 和 IDE
    將 eslint、prettier、env 加入應用程式。 遺憾的是,Angular 預設不會自行產生這一切。更改原理圖可以提高數千個 Angular 專案的品質。 設定 eslint 9 連結 eslint: yarn ng add @angular-eslint/schema...
    程式設計 發佈於2024-11-09
  • 使用 JavaScript 進行網頁抓取和代理設定的初學者指南
    使用 JavaScript 進行網頁抓取和代理設定的初學者指南
    使用JavaScript程式碼模擬使用者操作,以取得所需資訊。包括模擬使用者開啟網頁、點擊連結、輸入關鍵字等操作,並從網頁中提取所需資訊。 Javascript網頁抓取的核心原理 使用JavaScript程式碼模擬使用者操作來取得所需資訊。包括模擬使用者開啟網頁、點擊連結、輸入關鍵...
    程式設計 發佈於2024-11-09
  • 在 Android 上運行 Llama:使用 Ollama 的逐步指南
    在 Android 上運行 Llama:使用 Ollama 的逐步指南
    Llama 3.2 最近在 Meta 開發者大會上推出,展示了令人印象深刻的多模式功能以及針對使用高通和聯發科技硬體的行動裝置進行最佳化的版本。這項突破使開發人員能夠在行動裝置上運行 Llama 3.2 等強大的 AI 模型,為更高效、私密和響應迅速的 AI 應用程式鋪平道路。 Meta 發布了 ...
    程式設計 發佈於2024-11-09
  • 如何在 Python 中格式化字串以將它們對齊直列?
    如何在 Python 中格式化字串以將它們對齊直列?
    以固定寬度列印字串列印字串時,將它們對齊成直列可以增強可讀性。在 Python 中使用 format 或 f-string 提供了實現此目的的便捷方法。 使用 str.format()str.format() 提供了一個簡單的填充方法字串。其語法包括佔位符 {},後跟格式化表達式。對於左對齊,請使用...
    程式設計 發佈於2024-11-09
  • 為什麼微服務比單體架構重要
    為什麼微服務比單體架構重要
    在當今快節奏的技術環境中,企業需要可擴展且靈活的解決方案來快速適應不斷變化的需求。與傳統的整體方法相比,這就是微服務架構的亮點。 1.什麼是單體架構? 單體架構是一個單一的、統一的系統,其中所有元件都是互連和相互依賴的。這意味著對系統的任何更改或更新都需要重新建置和重新部署整個應用...
    程式設計 發佈於2024-11-09
  • 如何在 PHP 中存取物件屬性:了解語法和錯誤解決方案
    如何在 PHP 中存取物件屬性:了解語法和錯誤解決方案
    瞭解 PHP 物件屬性存取在 PHP 中,存取物件屬性對於處理複雜的資料結構至關重要。屬性保存與物件關聯的信息,使我們能夠管理和操作該數據。 存取物件屬性有兩種常用語法:1。 $property1此語法直接透過名稱存取特定屬性。它用於分配或檢索各個屬性的值。但是,這種方法要求您事先知道確切的屬性名稱...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3