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許可權修飾符public、 protected、 (預設)、 private置於類的成員定義前,用來限定物件對該類成員的訪問許可權。
對於 class 的許可權修飾符只可以用 public 和 default (預設)。
public 類可以在任意地方被訪問。
default 類只可以被同一個包內部的類訪問。
2、封裝性的體現,需要許可權修飾符來配合
(1)Java 規定的4中許可權(從小到大排列):private、預設、protected 、public
(2)4種許可權可以用來修飾類及類的內部結構:屬性、方法、構造器、內部類;
(3)具體的,4種許可權都可以用來修飾類的內部結構:屬性、方法、構造器、內部類;
(4)修飾類的話,只能使用:預設、public;
總結封裝性:Java提供了4種許可權修飾符來修飾類及類的內部結構,體現類及類的內部結構在被呼叫時的可見性的大小。