封裝的概念
封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的接口。面向對象計算始于這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。封裝是一種信息隱藏技術,在java中通過關鍵字private,protected和public實現封裝。
什么是封裝?
封裝把對象的所有組成部分組合在一起,封裝定義程序如何引用對象的數據,封裝實際上使用方法將類的數據隱藏起來,控制用戶對類的修改和訪問數據的程度。 適當的封裝可以讓程式碼更容易理解和維護,也加強了程式碼的安全性。
封裝的特點
1.只能通過規定的方法訪問數據。
2.隱藏類的實例細節,方便修改和實現。
實現封裝的具體步驟如下:
1.修改屬性的可見性來限制對屬性的訪問,一般設為 private。
2.為每個屬性創建一對賦值(setter)方法和取值(getter)方法,一般設為 public,用于屬性的讀寫。
3.在賦值和取值方法中,加入屬性控制語句(對屬性值的合法性進行判斷)。
下面以一個員工類的封裝為例介紹封裝過程。我們假設一個員工的主要屬性有姓名、年齡、工資。假設員工類為 Employee,示例如下:
public class Employee {private String name; // 姓名private int age; // 年齡private double balance; // 工資//定義無參構造方法public Employee() {}//定義有參構造方法public Employee(String name, double balance, int age) {this.getBalance();this.getAge();this.getName();}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {// 對年齡進行限制if (age > 18 && age < 45) {this.age = age;} else {System.out.println("年齡必須在18到45之間!");this. Age = 18; // 默認年齡}}public double getBalance() {return balance;}public void setBalance(double balance) {//工資必須大于1000if (balance>1000){this.balance = balance;}else {System.out.println("error");}}
}
如上述代碼所示,使用 private 關鍵字修飾屬性,這就意味著除了 Employee 類本身外,其他任何類都不可以訪問這些屬性。但是,可以通過這些屬性的 setXxx() 方法來對其進行賦值,通過 getXxx() 方法來訪問這些屬性。
在 age 屬性的 setAge() 方法中,首先對用戶傳遞過來的參數 age 進行判斷,如果 age 的值不在 18 到 45 之間,則將 Employee 類的 age 屬性值設置為 18,否則為傳遞過來的參數值。
編寫測試類 TestEmployee,在該類的 main() 方法中調用 Employee 屬性的 setXxx() 方法對其相應的屬性進行賦值,并調用 getXxx() 方法訪問屬性,代碼如下:
public class TestEmployee {public static void main(String[] args) {Employee people = new Employee();people.setName("小張");people.setAge(20);people.setBalance(10000);//輸出信息System.out.println("姓名:" + people.getName());System.out.println("年齡:" + people.getAge());System.out.println("工資:" + people.getBalance());}
}
封裝的作用
① 對象的數據封裝特性徹底消除了傳統結構方法中數據與操作分離所帶來的種種問題,提高了程序的可復用性和可維護性,降低了程序員保持數據與操作內容的負擔。
②對象的數據封裝特性還可以把對象的私有數據和公共數據分離開,保護了私有數據,減少了可能的模塊間干擾,達到降低程序復雜性、提高可控性的目的。