
Java 教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java 與 C++
- JVM - Java 虛擬機器
- Java - JDK vs JRE vs JVM
- Java - Hello World 程式
- Java - 環境設定
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode 系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期和時間
Java 控制語句
- Java - 迴圈控制
- Java - 決策制定
- Java - if-else
- Java - switch
- Java - for 迴圈
- Java - for-each 迴圈
- Java - while 迴圈
- Java - do-while 迴圈
- Java - break
- Java - continue
面向物件程式設計
- Java - OOPs 概念
- Java - 物件和類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 建構函式
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型
- Java - 重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉建構函式
- Java - 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤和異常
- Java - 異常
- Java - try-catch 塊
- Java - try-with-resources
- Java - 多重 catch 塊
- Java - 巢狀 try 塊
- Java - finally 塊
- Java - throw 異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java 多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 執行緒連線
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java 同步
Java 網路程式設計
- Java - 網路程式設計
- Java - Socket 程式設計
- Java - URL 處理
- Java - URL 類
- Java - URLConnection 類
- Java - HttpURLConnection 類
- Java - Socket 類
- Java - 泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java - 命令列引數
- Java - Lambda 表示式
- Java - 傳送郵件
- Java - Applet 基礎
- Java - Javadoc 註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像 API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional 類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64 編碼解碼
- Java - switch 表示式
- Java - Teeing 收集器
- Java - 微基準測試
- Java - 文字塊
- Java - 動態 CDS 歸檔
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 簡潔數字格式化
- Java - 垃圾回收
- Java - JIT 編譯器
Java 雜項
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - Process API 改進
- Java - Stream API 改進
- Java - 增強的 @Deprecated 註解
- Java - CompletableFuture API 改進
- Java - 流
- Java - 日期時間 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java APIs 和框架
Java 類引用
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用資源
Java - 封裝
Java 封裝
封裝是四個基本OOP 概念之一。另外三個是繼承、多型和抽象。
Java 中的封裝是一種將資料(變數)和作用於資料的方法(方法)包裝在一起作為單個單元的機制。在封裝中,類的變數將對其他類隱藏,只能透過其當前類的方法訪問。因此,它也被稱為資料隱藏。
在 Java 中實現封裝
為了在 Java 中實現封裝 -
將類的變數宣告為私有。
提供公共的 setter 和 getter 方法來修改和檢視變數的值。
Java 封裝示例
以下是一個演示如何在 Java 中實現封裝的示例:
/* File name : EncapTest.java */ public class EncapTest { private String name; private String idNum; private int age; public int getAge() { return age; } public String getName() { return name; } public String getIdNum() { return idNum; } public void setAge( int newAge) { age = newAge; } public void setName(String newName) { name = newName; } public void setIdNum( String newId) { idNum = newId; } }
公共的setXXX()和getXXX()方法是EncapTest類例項變數的訪問點。通常,這些方法被稱為 getter 和 setter。因此,任何想要訪問變數的類都應該透過這些 getter 和 setter 來訪問它們。
可以使用以下程式訪問EncapTest類的變數:
/* File name : RunEncap.java */ public class RunEncap { public static void main(String args[]) { EncapTest encap = new EncapTest(); encap.setName("James"); encap.setAge(20); encap.setIdNum("12343ms"); System.out.print("Name : " + encap.getName() + " Age : " + encap.getAge()); } } public class EncapTest { private String name; private String idNum; private int age; public int getAge() { return age; } public String getName() { return name; } public String getIdNum() { return idNum; } public void setAge( int newAge) { age = newAge; } public void setName(String newName) { name = newName; } public void setIdNum( String newId) { idNum = newId; } }
輸出
Name : James Age : 20
封裝的好處
類的欄位可以設定為只讀或只寫。
類可以完全控制儲存在其欄位中的內容。
Java 封裝:只讀類
只讀類只能具有 getter 方法來獲取屬性的值,不應該有任何 setter 方法。
示例:建立只讀類
在這個例子中,我們定義了一個類Person,它有兩個 getter 方法getName()和getAge()。這些方法可以用來獲取在類中宣告為私有的屬性的值。
// Class "Person" class Person { private String name = "Robert"; private int age = 21; // Getter methods public String getName() { return this.name; } public int getAge() { return this.age; } } public class Main { public static void main(String args[]) { // Object to Person class Person per = new Person(); // Getting and printing the values System.out.println("Name of the person is: " + per.getName()); System.out.println("Age of the person is: " + per.getAge()); } }
輸出
Name of the person is: Robert Age of the person is: 21
Java 封裝:只寫類
只寫類只能具有 setter 方法來設定屬性的值,不應該有任何 getter 方法。
示例:建立只寫類
在這個例子中,我們定義了一個類Person,它有兩個 setter 方法setName()和setAge()。這些方法可以用來設定在類中宣告為私有的屬性的值。
// Class "Person" class Person { private String name; private int age; // Setter Methods public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } } public class Main { public static void main(String args[]) { // Object to Person class Person per = new Person(); // Setting the values per.setName("Robert"); per.setAge(21); } }
Java 封裝:更多示例
示例 1:Person 類(完全封裝)
此示例建立一個名為“Person”的完全封裝類。此類具有私有類屬性、setter 和 getter 方法。
// Class "Person" class Person { private String name; private int age; // Setter Methods public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } // Getter methods public String getName() { return this.name; } public int getAge() { return this.age; } } // The Main class to test encapsulated class "Person" public class Main { public static void main(String args[]) { // Objects to Person class Person per1 = new Person(); Person per2 = new Person(); // Setting the values per1.setName("Robert"); per1.setAge(21); per2.setName("Riyan"); per2.setAge(22); // Printing the values System.out.println("Person 1: Name : " + per1.getName() + " Age : " + per1.getAge()); System.out.println("Person 2: Name : " + per2.getName() + " Age : " + per2.getAge()); } }
輸出
Person 1: Name : Robert Age : 21 Person 2: Name : Riyan Age : 22
示例 2:Employee 類(完全封裝)
此示例建立一個名為“Employee”的完全封裝類。此類具有私有類屬性、setter 和 getter 方法。
// Class "Employee" class Employee { private String emp_name; private String emp_id; private double net_salary; // Constructor public Employee(String emp_name, String emp_id, double net_salary) { this.emp_name = emp_name; this.emp_id = emp_id; this.net_salary = net_salary; } // Getter methods public String getEmpName() { return emp_name; } public String getEmpId() { return emp_id; } public double getSalary() { return net_salary; } // Setter methods public void setEmpName(String emp_name) { this.emp_name = emp_name; } public void setEmpId(String emp_id) { this.emp_id = emp_id; } public void setSalary(double net_salary) { this.net_salary = net_salary; } } // The Main class to test encapsulated class "Employee" public class Main { public static void main(String args[]) { // Objects to Employee class // First object - setting values using constructor Employee emp = new Employee("Robert", "EMP001", 75450.00); // Printing data System.out.println("Employee (Intial Values):"); System.out.println(emp.getEmpId() + " , " + emp.getEmpName() + " , " + emp.getSalary()); // Updating values using setter methods emp.setEmpName("Riyan"); emp.setEmpId("EMP002"); emp.setSalary(90500.00); // Printing data System.out.println("Employee (Updated Values):"); System.out.println(emp.getEmpId() + " , " + emp.getEmpName() + " , " + emp.getSalary()); } }
輸出
Employee (Intial Values): EMP001 , Robert , 75450.0 Employee (Updated Values): EMP002 , Riyan , 90500.0
廣告