1. 程式人生 > 實用技巧 >Java 面向物件(五)面向物件特徵之一:封裝性(封裝與隱藏)

Java 面向物件(五)面向物件特徵之一:封裝性(封裝與隱藏)

一、封裝性的引入

  1、高內聚,低耦合

    高內聚:類的內部資料操作細節自己完成,不允許外部干涉;

    低耦合:僅對外暴露少量的方法用於使用。

  2、封裝性的設計思想

    隱藏物件內部的複雜性,只對外公開簡單的介面。便於外界呼叫,從而提高系統的可擴充套件性、可維護性。通俗的說把該隱藏的隱藏起來,該暴露的暴露出來。 這就是封裝性的設計思想。

  3、問題的引入

    當我們建立一個類的物件以後,我們可以通過"物件.屬性"的方式,對物件的屬性進行賦值。這裡,賦值操作要受到屬性的資料型別和儲存範圍的制約。除此之外,沒有其他制約條件。但是,在實際問題中,我們往往需要給屬性賦值加入額外的限制條件。這個條件就不能在屬性宣告時體現,我們只能通過方法進行限制條件的新增。(比如:年齡屬性不能為負數等問題)

    同時,我們需要避免使用者再使用"物件.屬性"的方式對屬性進行賦值。則需要將屬性宣告為私有的(private)。

    至此,針對於屬性就體現了封裝性。

    

二、封裝性的體現

  1、資訊的封裝和隱藏

    Java 中通過資料宣告為私有的(private),再提供公共的(public)方法:getXxx()和 setXxx() 實現對該屬性的操作,以實現下述目的:

    (1)隱藏一個類中不需要對外提供的實現細節;

    (2)使用者只能通過事先定製好的方法來訪問資料,可以方便地加入控制邏輯,限制對屬性的不合理操作;

    (3)便於修改,增強程式碼的可維護性;

  2、Demo

 1 public class Zoo {
 2     public static void main(String[] args) {
 3         Animal animal = new Animal();
 4         animal.setLegs(4);   // animal.setLegs(-100);
 5         //animal.legs = -100;  //非法的,The field Animal.legs is not visible
 6         System.out.println(animal.getLegs());
 7     }
 8 }
9 10 class Animal { 11 private int legs; //將屬性legs定義為private,只能被Animal類內部訪問 12 public void setLegs(int i) { 13 if (i != 0 && i != 2 && i != 4) { 14 System.out.println("Wrong number of legs"); 15 return; 16 } 17 legs = i; 18 } 19 20 public int getLegs() { 21 return legs; 22 } 23 }

  3、封裝性的體現

    對封裝性的體現不僅表現在上面的私有的 成員變數,還包括不對外暴露的私有的方法,私有的構造方法等。

三、四種訪問許可權修飾符

  1、四種訪問許可權修飾符

    Java許可權修飾符publicprotected(預設)private置於類的成員定義前,用來限定物件對該類成員的訪問許可權。

    

    對於 class 的許可權修飾符只可以用 public 和 default (預設)

    public 類可以在任意地方被訪問。

    default 類只可以被同一個包內部的類訪問。

    

  2、封裝性的體現,需要許可權修飾符來配合

    (1)Java 規定的4中許可權(從小到大排列):private、預設、protected 、public

    (2)4種許可權可以用來修飾類及類的內部結構:屬性、方法、構造器、內部類;

    (3)具體的,4種許可權都可以用來修飾類的內部結構:屬性、方法、構造器、內部類;

    (4)修飾類的話,只能使用:預設、public;

  總結封裝性:Java提供了4種許可權修飾符來修飾類及類的內部結構,體現類及類的內部結構在被呼叫時的可見性的大小。