天天看點

[Java入門筆記] 面向對象三大特征之:封裝了解封裝

了解封裝

什麼是封裝?

在Java的面向對象程式設計中,有三大基本特征:封裝、繼承和多态。首先我們先來看看封裝:

在Java的面對對象程式設計中,封裝(Encapsulation)是指一種将函數功能實作細節部份包裝、隐藏起來的方法。封裝可以被認為是一個保護屏障,防止該類的代碼和資料被外部類定義的代碼随便通路。如果要通路類中的代碼和資料,必須要通過嚴格的控制。

為什麼要使用封裝?

使用封裝主要有以下好處:

  • 能夠隐藏該類中一些功能的實作細節。讓調用者通過事先實作好的方法通路類的功能和資料,同時也限制對類中資料的不合理通路。
  • 對資料進行檢查,有利于保護對象資訊的完整和合理性。
  • 便于對代碼的修改和維護,提高代碼的可維護性。

如何使用封裝?

通路權限控制符

Java中一共有四個通路權限控制符,用來對類和對象的資料進行封裝:

修飾符 類内部 同一個包 子類真 全局範圍
private
default
protected
public

對于外部類,也可以使用修飾符,不過外部類隻能使用public和預設兩種修飾符。

例子

public class Person {
    
    //用private修飾符修飾,外部無法通路
    private String name;  //姓名
    private int age;      //年齡
    private String idNum;  //身份證号
    
    //得到該類對象的姓名
    public String getName() {
        return name;
    }
    
    //設定該類的對象的姓名,如果傳入空值,則不指派
    public void setName(String name) {
        if(name.length() == 0 || name == null){
            return;
        }
        this.name = name;
    }
    
    //得到年齡
    public int getAge() {
        return age;
    }
    
    //設定年齡,當傳入的參數大于等于0時,才将參數設定給該對象
    public void setAge(int age) {
        if(age >= 0){
            this.age = age;
        }
    }
    
    //得到身份證号
    public String getIdNum() {
        return idNum;
    }
    
    //設定身份證号
    public void setIdNum(String idNum) {
        this.idNum = idNum;
    }
  
}      

上面的例子中我們為該類中的屬性增加了private修飾符,外部無法再直接通路和修改這些屬性,如果有需要使用,我們則需要為其增加getXxx和setXxx方法通路這些事項,同時,我們也可以在這些方法中對這些屬性的通路進行控制,比如姓名不能為空,年齡不能為負數等等。

這樣我們并可見對程式的完整性和合理性進行合理的控制,也能更好的增強代碼的安全性,也使代碼能夠更好的管理與維護。

public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "張三";  //錯誤,無法直接通路
        p.setName("張三");
        p.setAge(-5); 
        System.out.println(p.getAge());  //輸出預設值0,盡管我們在上一行代碼中傳入一個數值,但是我們在setAge方法中做了控制,是以傳入的負數并沒有賦給p對象
    }

}      

使用原則

關于通路控制符的使用,我們使用應當盡量符合下面一些原則:

  • 類的大部分成員變量,都應該使用private修飾符,隻有一些static、全局變量的Field,才考慮使用public修飾符。
  • 如果某個類主要用作其他類的父類,類中的大部分方法和屬性希望被子類重寫和使用,而又不想被外部直接調用,則應當使用protected修飾符。
  • 希望被暴露出來直接被外部使用的方法,應當使用public修飾符。
  • 一個方法的功能隻有在類的内部被調用時,應當使用private修飾符。

轉載于:https://www.cnblogs.com/hopeblog/p/5065317.html