Java面向對象三大特徵之一 —— 封裝性

Java面向對象三大特徵之一 —— 封裝性

(一)、封裝概述

1.1 概述

面向對象編程語言是對客觀世界的模擬,客觀世界裏成員變量都是隱藏在對象內部的,外界無法直接操作和修改。封裝可以被認爲是一個保護屏障,防止該類的代碼和數據被其他類隨意訪問。要訪問該類的數據,必須通過指定的方式。適當的封裝可以讓代碼更容易理解與維護,也加強了代碼的安全性。

1.2 原則

將屬性隱藏起來,若需要訪問某個屬性,提供公共方法對其訪問。

(二)、封裝的步驟

  1. 使用 private關鍵字來修飾成員變量。
  2. 對需要訪問的成員變量,提供對應的一對 【getXxx 方法】 、【setXxx 方法】。

2.1 private的含義

  1. private是一個權限修飾符,代表最小權限。
  2. 可以修飾成員變量和成員方法。
  3. 被private修飾後的成員變量和成員方法,只在本類中才能訪問。

2.2 private的使用格式

private 數據類型 變量名 ;

  1. 使用 private 修飾成員變量,代碼如下:
public class Student {
	private String name;
	private int age;
}

注意:一旦使用了private進行修飾,那麼本類當中仍然可以所以訪問。但是,超出本類範圍之外就不能再直接訪問了。

  1. 提供【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());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章