Skip to content

Latest commit

 

History

History
93 lines (75 loc) · 2.14 KB

封裝.md

File metadata and controls

93 lines (75 loc) · 2.14 KB

封裝 (Encapsulation)

意義

指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。

未封裝過的代碼可能產生的問題

  • 可被其他程序創建對象後訪問,容易造成不確定性和安全隱患。

未封裝代碼

public class Person {
	
	int age;
	
	void talk() {
		System.out.println("age = " + age);
	}
}

public class PersonDemo {
		
	public static void main(String[] args) {
		
		Person p = new Person();
		p.age = -10;
		p.talk();
	}

打印結果

age = -10; //年齡不可能為負數,不合要求。

封裝後代碼

public class Person {
	
	private int age;//將 age 變為私有的
	
	//透過getter與setter獲取以及改變參數值
	public void setAge(int a) {
	    //可透過 if 或其他語句對年齡的賦值條件進行限制
	    if(a > 0 && a < 100) {
	        age = a;
	        talk();
	    } else {
	        System.out.println("Invalid input");
	    }
	}
	
	public int getAge() {
	    
	    return age;
	}
	
	void talk() {
		System.out.println("age = " + age);
	}
}

public class PersonDemo {
		
	public static void main(String[] args) {
		
		Person p = new Person();
		//p.age = -10; age 不可被直接訪問
		p.setAge(20);
		p.setAge(-10);
		System.out.println(10 + p.getAge());//如果要獲取被封裝後的變量值可以調用此方法
	}

打印結果

age = 20
Invalid input
age = 30;

封裝好處

  • 提高重用性。
  • 提高安全性。
  • 將變化隔離。
  • 便於使用。

封裝原則

  • 將不需要對外提供的內容都隱藏起來。
  • 把屬性都隱藏,提供公共方法對其訪問。
  • 有些情況下可不必提供公共方法。EX: 之前學過的幾種排序方法,元素交換位置的方法就可設置為 private 的,因其只提供排序方法進行交換位置的動作,可不必對外提供。 ##private
  • 私有,是一個權限修飾符,用於修飾成員變量 (不可用於修飾局部變量), 私有的內容只在本類中有效。
  • 對外提供對應的 getXXX() 和 setXXX() 方法
  • 注意: 私有僅僅是封裝的一種體現而已。(私有是封裝,但封裝不一定是私有)