封裝是面向對象系統的一個重要特性,是抽象數據類型思想的具體體現。
在面向對象的程序設計中,抽象數據類型是用“類”這種結構來代表的,而“類”又是面向對象的工具可理解和操縱的。
1 封裝的概念
封裝也稱為信息隱藏,是指利用抽象數據類型將數據和基于數據的操作封裝在一起,使其構成一個不可分割的獨立實體,數據被保護在抽象數據類型的內部,盡可能地隱藏內部的細節,只保留一些對外接口使之與外部發生聯系。
系統的其他部分只有通過包裹在數據外面的被授權的操作來與這個抽象數據類型交流與交互。
也就是說,用戶無需知道對象內部方法的實現細節,但可以根據對象提供的外部接口(對象名和參數)訪問該對象。
封裝具有下述特征:
在類的定義中設置訪問對象屬性(數據成員)及方法(成員方法)的權限,限制本類對象及其他類的對象使用的范圍。
提供一個接口來描述其他對象的使用方法。
其他對象不能直接修改本對象所擁有的屬性和方法。
封裝反映了事物的相對獨立性。
封裝在編程上的作用是使對象以外的部分不能隨意存取對象的內部數據(屬性),從而有效地避免了外部錯誤對它的“交叉感染”。
另一方面,當對象的內部做了某些修改時,由于它只通過少量的接口對外提供服務,因此大大減少了內部的修改對外部的影響。
面向對象系統的封裝單位是對象,類概念本身也具有封裝的意義,因為對象的特性是由它所屬的類說明來描述的。
2 類的嚴謹定義
[類修飾符] class 類名 [extends 父類名] [implements 接口列表]
{
數據成員
成員方法
}
合理地使用這些可選項,可以充分地展示封裝、繼承和信息隱藏等面向對象特性。
類修飾符(Qualifier):用于規定類的一些特殊性,主要是說明對它的訪問限制。
extends 父類名:指明新定義的類是由已存在的父類派生出來的。
implements 接口列表:Java 本來只支持單繼承,為了給多重繼承的軟件開發提供方便,它提供了這一接口機制。
3 類修飾符
類的修飾符用于說明對它的訪問限制,一個類可以沒有修飾符,也可以有 public、final、abstract 等幾種不同的修飾符。
3.1 無修飾符的情況
如果一個類前無修飾符,則這個類只能被同一個包里的類使用。
Java 規定,同一個程序文件中的所有類都在同一個包中。
無修飾符的類可以被同一個程序文件中的類使用,但不能被其他程序文件中的其他包中的類使用。
3.2 public 修飾符
如果一個類的修飾符是 public,則這個類是公共類。
公共類不但可供它所在包中的其他類使用,也可供其他包中的類使用。
在程序中可以用 import 語句引用其他包中的 public 類。
Java 規定,在一個程序文件中,只能定義一個 public 類,其余的類可以是無修飾符的類,也可以是用 final 修飾符定義的最終類,否則編譯時會報錯。
3.3 final 修飾符
用 final 修飾符修飾的類被稱為最終類。
最終類是不能被任何其他類所繼承的。
定義最終類的目的有三:
用來完成某種標準功能。將一個類定義為 final 類,則可以將它的內容、屬性和功能固定下來,與它的類名形成穩定的映射關系,從而保證引用這個類時所實現的功能是正確無誤的。
提高程序的可讀性。從父類派生子類,再從子類派生子類,使軟件變得越來越復雜。而在必要的層次上設置 final 類,可以提高程序的可讀性。
提高安全性。病毒的闖入途徑之一是在一些處理關鍵信息的類中派生子類,再用子類去替代原來的類。由于用 final 修飾符定義的類不能再派生子類,截斷了病毒闖入的途徑,因而提高了程序的安全性。
3.4 abstract 修飾符
用 abstract 修飾符修飾的類稱為抽象類。
抽象類刻畫了研究對象的公有行為特征,并通過繼承機制將這些特征傳送給它的派生類。
其作用在于將許多有關的類組織在一起,提供一個公共的基類,為派生具體類奠定基礎。
此外,當一個類中出現一個或多個用 abstract 修飾符定義的方法時,則必須在這個類的前面加上 abstract 修飾符,將其定義為抽象類。
3.5 類修飾符使用注意事項
可以同時使用兩個修飾符來修飾一個類,當使用兩個修飾符修飾一個類時,這些修飾符之間用空格分開,寫在關鍵字 class 之前,修飾符的順序對類的性質沒有任何影響。
需要注意的是:一個類可以為修飾為 public abstract,也可以被修飾為 public final,但不能被修飾為 abstract final,這是因為 abstract 類自身沒有對象,需要派生子類后再創建子類的對象,而 final 類不能派生子類,所以不存在用 abstract final 兩個修飾符修飾的類。