iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0

封裝

封裝指的是將不想或者不需要公開給別人知道的部分隱藏起來,例如不需要會組裝電腦,但是還是可以使用電腦,不需要理解冷氣機的構造,還是可以吹冷氣;因為電腦公司已經將電腦組裝好提供給需要使用的人使用,冷氣機公司已經將冷氣內的各種功能包裝好,只需要按下開啟就能使用。

Java中的封裝有四個修飾符

  • private:僅可讓自身的類使用。
  • default(未設置任何修飾):可以提供給同一個package 的類使用,其他不可以。
  • protected :可以提供給子package 的類使用。
  • public :任何類都可以使用。

封裝的好處

  • 可以保護屬性或方法不被獲取。
  • 可以提高代碼的維護。
  • 隱藏複雜性。
  • 實現模塊化(低耦合)。
  • 代碼的重用性。

Java中權限低至高排序

privatedefaultprotectedpublic

使用方式:

public class PersonTest {
	public static void main(String[] args) {
		Person person = new Person();
		
		person.name = "Jasper";
		//person.age = 25; // 這樣會錯誤,因為在Person class中已經將age 設定為private,所以是無法使用的
		person.setAge(25);
		System.out.println(name + "is " + person.getAge() + " years old."); // Jasper is 25 years old.
	}
}

class Person {
	String name;
	private int age;
		
	protected void drink() {
		System.out.println("Drinking water is necessary for person");
	}
	
	public void setAge(int num) {
		if(num >= 0) {
			age = num;
		}
	}
	
	public int getAge() {
		return age;
	}
}

Person 這個class 來舉例可以看到(第二個class 的位置)

  1. 一開始定義了一個String name; 的屬性,他屬於default(未設置權限) ,所以可以提供給同一個package 中的PersonTest 使用。
  2. 第三行的private int age; 的屬性,只可以在Person 這個class 中使用,如果在PersonTest 去使用時,會出現錯誤。
  3. Person 中定義了一個setAge 的方法去對age 進行賦值。
  4. 以及在Person 中定義了一個getAge 的方法去獲取age 的值。
  5. PersonTest 中,實例化 一個Person 類,並且去進行賦值、調用方法的操作。

假設現在有這兩個不同的package ,分別是management_departmentengineering_department

src/
└── com/
    └── jaspercompany/
        ├── management_department/
        │   └── Employee.java
        └── engineering_department/
            └── EmployeeTest.java

management_department 裡的Employee.java 程式碼如下:

class Employee {
	private String name;
	String phoneNumber;
	public String jobTitle;
}

engineering_department 裡的EmployeeTest.java 程式碼如下:

import com.jaspercompany.management_department.Employee;

public class EmployeeTest {
	public static void main(String[] args) {
		Employee employee = new Employee();
		
		employee.name = "Jasper";
		employee.phoneNumber = "0912345678";
		employee.jobTitle = "Boss";
	}
}

請問上面實例化employee ,會出現甚麼問題?

  1. employeenameprivate 屬性,無法在外部使用,只能在class Employee 裡面使用
  2. employeephoneNumberdefault(沒有填寫任何權限修飾)屬性,無法在外部使用,只能在class Employee 或是在management_department 中的其他.java文件使用
  3. jobTitle 可以正常使用,因為是public 屬性

所以上面會有兩個錯誤,程式碼無法正常運行。


已經將過去(含今天)文章內容中所有實體化的部分改為實例化較為準確一點,用字較為準確,如果有造成誤會請見諒。


上一篇
Day15-package、import
下一篇
Day17-constructor & this
系列文
前端工程師的java學習紀錄37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言