Java面向對象三大特徵之一 —— 封裝性
(一)、封裝概述
1.1 概述
面向對象編程語言是對客觀世界的模擬,客觀世界裏成員變量都是隱藏在對象內部的,外界無法直接操作和修改。封裝可以被認爲是一個保護屏障,防止該類的代碼和數據被其他類隨意訪問。要訪問該類的數據,必須通過指定的方式。適當的封裝可以讓代碼更容易理解與維護,也加強了代碼的安全性。
1.2 原則
將屬性隱藏起來,若需要訪問某個屬性,提供公共方法對其訪問。
(二)、封裝的步驟
- 使用
private
關鍵字來修飾成員變量。 - 對需要訪問的成員變量,提供對應的一對 【getXxx 方法】 、【setXxx 方法】。
2.1 private的含義
- private是一個權限修飾符,代表最小權限。
- 可以修飾成員變量和成員方法。
- 被private修飾後的成員變量和成員方法,只在本類中才能訪問。
2.2 private的使用格式
private 數據類型 變量名 ;
- 使用 private 修飾成員變量,代碼如下:
public class Student {
private String name;
private int age;
}
注意:一旦使用了private進行修飾,那麼本類當中仍然可以所以訪問。但是,超出本類範圍之外就不能再直接訪問了。
- 提供【getXxx】方法 /【setXxx】方法,可以訪問成員變量,代碼如下:
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
(三)、封裝優化1 —— this關鍵字
【setXxx】:方法中的形參名字並不符合見名知意的規定,那麼如果修改與成員變量名一致,是否就見名知意了呢?代碼如下:
public class Student {
private String name;
private int age;
public void setName(String name) {
name = name;
}
public void setAge(int age) {
age = age;
}
}
經過修改和測試,我們發現新的問題,成員變量賦值失敗了。也就是說,在修改了 setXxx() 的形參變量名後,方法並沒有給成員變量賦值!這是由於形參變量名與成員變量名重名,導致成員變量名被隱藏,方法中的變量名,無法訪問到成員變量,從而賦值失敗。所以,我們只能使用this關鍵字,來解決這個重名問題。
3.1 this的含義
this代表所在類的當前對象的引用(地址值),即對象自己的引用。
記住 :方法被哪個對象調用,方法中的this就代表那個對象。即誰在調用,this就代表誰。
3.2 this使用格式
this.成員變量名;
使用 this 修飾方法中的變量,解決成員變量被隱藏的問題,代碼如下:
public class Student {
private String name;
private int age;
public void setName(String name) {
// name = name;
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
// age = age;
this.age = age;
}
public int getAge() {
return age;
}
}
注意:方法中只有一個變量名時,默認也是使用 this 修飾,可以省略不寫。
(四)、封裝優化2 —— 構造方法
- 構造方法是專門用來創建對象的方法,當我們通過關鍵字new來創建對象時,其實就是在調用構造方法。
注意事項:
①、構造方法的名稱必須和所在的類名稱完全一樣,就連大小寫也要一樣。
②、構造方法不要寫返回值類型,連void都不要寫。
③、構造方法不能return一個具體的返回值。
④、如果沒有編寫任何構造方法,那麼編譯器將會默認贈送一個構造方法,沒有參數、方法體什麼事情都不做。
⑤、一旦編寫了至少一個構造方法,那麼編譯器將不再贈送。
⑥、構造方法也是可以進行重載的。【重載:方法名相同,參數列表不同】
4.1 構造方法的定義格式
修飾符 構造方法(參數列表){
//方法體
}
public class Student {
private String name;
private int age;
// 無參數構造方法
public Student() {
}
// 有參數構造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
(五)、標準代碼 —— JavaBean
JavaBean 是 Java語言編寫類的一種標準規範。符合 JavaBean 的類,要求類必須是具體的和公共的,並且具有無參數的構造方法,提供用來操作成員變量的 set 和 get 方法。
- 一個標準的類通常要擁有下面四個組成部分:
①、所有的成員變量都要使用private關鍵字修飾。
②、爲每一個成員變量編寫一個對Getter和Setter方法。
③、編寫一個無參數的構造方法。
④、編寫一個全參數的構造方法。
public class ClassName{
//成員變量
//構造方法
//無參構造方法【必須】
//有參構造方法【建議】
//成員方法
//getXxx()
//setXxx()
}
編寫符合JavaBean規範的類,
public class Student {
// 成員變量
private String name;
private int age;
// 構造方法
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
// 成員方法
publicvoid setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
publicvoid setAge(int age) {
this.age = age;
}
publicint getAge() {
return age;
}
}
測試類如下:
public class TestStudent {
public static void main(String[] args) {
//無參構造使用
Student s= new Student();
s.setName("柳巖");
s.setAge(18);
System.out.println(s.getName()+"‐‐‐"+s.getAge());
//帶參構造使用
Student s2= new Student("趙麗穎",18);
System.out.println(s2.getName()+"‐‐‐"+s2.getAge());
}
}