封裝指的是將不想或者不需要公開給別人知道的部分隱藏起來,例如不需要會組裝電腦,但是還是可以使用電腦,不需要理解冷氣機的構造,還是可以吹冷氣;因為電腦公司已經將電腦組裝好提供給需要使用的人使用,冷氣機公司已經將冷氣內的各種功能包裝好,只需要按下開啟就能使用。
private:僅可讓自身的類使用。default(未設置任何修飾):可以提供給同一個package 的類使用,其他不可以。protected :可以提供給子package 的類使用。public :任何類都可以使用。private → default → protected → public
使用方式:
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 的位置)
String name; 的屬性,他屬於default(未設置權限) ,所以可以提供給同一個package 中的PersonTest 使用。private int age; 的屬性,只可以在Person 這個class 中使用,如果在PersonTest 去使用時,會出現錯誤。Person 中定義了一個setAge 的方法去對age 進行賦值。Person 中定義了一個getAge 的方法去獲取age 的值。PersonTest 中,實例化 一個Person 類,並且去進行賦值、調用方法的操作。假設現在有這兩個不同的package ,分別是management_department 和engineering_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 ,會出現甚麼問題?
employee的name是private 屬性,無法在外部使用,只能在class Employee 裡面使用employee的phoneNumber是default(沒有填寫任何權限修飾)屬性,無法在外部使用,只能在class Employee 或是在management_department 中的其他.java文件使用jobTitle 可以正常使用,因為是public 屬性所以上面會有兩個錯誤,程式碼無法正常運行。
已經將過去(含今天)文章內容中所有實體化的部分改為實例化較為準確一點,用字較為準確,如果有造成誤會請見諒。