1. 程式人生 > >【Java】面向對象之封裝

【Java】面向對象之封裝

對象的引用 變量 自己 編程 自定義 值類型 只有一個 並且 由於

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

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

封裝操作——使用private關鍵字

一、private的含義

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

二、private的使用

1.使用 private 修飾成員變量,代碼如下:

public class Person {

    private String name; 

    private int age; 

}

2.提供 getXxx 方法 / setXxx 方法,可以訪問成員變量,代碼如下:

public class Person{

    private String name;
    private int age;
    private boolean male; 

    public void setMale(boolean b) {
        male = b;
    }

    //對於基本類型當中的boolean值,Getter方法一定要寫成isXxx的形式,而setXxx規則不變。
public boolean isMale() { return male; } public void setName(String str) { name = str; } public String getName() { return name; } public void setAge(int num) { age = num; } public int getAge() { return age; } }
一旦使用了private進行修飾,那麽本類當中仍然可以隨意訪問。但是,超出了本類範圍之外就不能再直接訪問了。
間接訪問private成員變量,就是定義一對兒Getter/Setter方法;必須叫setXxx或者是getXxx命名規則。
對於Getter來說,不能有參數,返回值類型和成員變量對應; 對於Setter來說,不能有返回值,參數類型和成員變量對應。 
3.this關鍵字
public class Person{

    private String name;
    private int age;

    public void setName(String name) {
        name = name;
    }

    public void setAge(int age) {
        age = age;
    }

}

   仔細發現上面代碼使用了成員變量和局部變量名稱一致。經過測試你會發現成員變量賦值失敗了。也就是說,在修改了 setXxx() 的形參變量名後,方法並沒有給成員變量賦值!這是由於形參變量名與成員變量名重名,導致成員變量名被隱藏,方法中的變量名,無法訪問到成員變量,從而賦值失敗。所以,我們只能使用this關鍵字,來解決這個重名問題。

this的含義:this代表所在類的當前對象的引用(地址值),即對象自己的引用。方法被哪個對象調用,方法中的this就代表那個對象。即誰在調用,this就代表誰。

使用 this 修飾方法中的變量,解決成員變量被隱藏的問題,代碼如下:

public class Person{

    private String name; 
    private int age; 


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

方法中只有一個變量名時,默認也是使用 this 修飾,可以省略不寫。

構造方法

一、定義構造方法

  當一個對象被創建時候,構造方法用來初始化該對象,給對象的成員變量賦初始值。

無論你與否自定義構造方法,所有的類都有構造方法,因為Java自動提供了一個無參數構造方法,一旦自己定義了構造方法,Java自動提供的默認無參數構造方法就會失效。

定義格式:

修飾符 類名稱(參數列表){

  // 方法體
}

構造方法的寫法上,方法名與它所在的類名相同。它沒有返回值,所以不需要返回值類型,甚至不需要void。使用構造方法後,代碼如下:

public class Person{

    private String name; 
    private int age; 

    public Person() {

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

}

註意事項:
  1. 如果你不提供構造方法,系統會給出無參數構造方法。
  2. 如果你提供了構造方法,系統將不再提供無參數構造方法。
  3. 構造方法是可以重載的,既可以定義參數,也可以不定義參數。

二、JavaBean

  JavaBean 是 Java語言編寫類的一種標準規範。符合 JavaBean 的類,要求類必須是具體的和公共的,並且具有無參數的構造方法,提供用來操作成員變量的 set 和 get 方法。

public class ClassName{
    //成員變量
    //構造方法
    //無參構造方法【必須】
    //有參構造方法【建議】
    //成員方法
    //getXxx()
    //setXxx()
}

編寫符合 JavaBean 規範的類,以Person類為例,標準代碼如下:

public class Person{

    private String name; 
    private int age; 

    // 無參構造方法
    public Person() {
        // 方法體
    }

    // 有參構造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        // 方法體
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

【Java】面向對象之封裝