封裝是面向?qū)ο笙到y(tǒng)的一個(gè)重要特性,是抽象數(shù)據(jù)類型思想的具體體現(xiàn)。
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,抽象數(shù)據(jù)類型是用“類”這種結(jié)構(gòu)來代表的,而“類”又是面向?qū)ο蟮墓ぞ呖衫斫夂筒倏v的。
1 封裝的概念
封裝也稱為信息隱藏,是指利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起,使其構(gòu)成一個(gè)不可分割的獨(dú)立實(shí)體,數(shù)據(jù)被保護(hù)在抽象數(shù)據(jù)類型的內(nèi)部,盡可能地隱藏內(nèi)部的細(xì)節(jié),只保留一些對(duì)外接口使之與外部發(fā)生聯(lián)系。
系統(tǒng)的其他部分只有通過包裹在數(shù)據(jù)外面的被授權(quán)的操作來與這個(gè)抽象數(shù)據(jù)類型交流與交互。
也就是說,用戶無需知道對(duì)象內(nèi)部方法的實(shí)現(xiàn)細(xì)節(jié),但可以根據(jù)對(duì)象提供的外部接口(對(duì)象名和參數(shù))訪問該對(duì)象。
封裝具有下述特征:
在類的定義中設(shè)置訪問對(duì)象屬性(數(shù)據(jù)成員)及方法(成員方法)的權(quán)限,限制本類對(duì)象及其他類的對(duì)象使用的范圍。
提供一個(gè)接口來描述其他對(duì)象的使用方法。
其他對(duì)象不能直接修改本對(duì)象所擁有的屬性和方法。
封裝反映了事物的相對(duì)獨(dú)立性。
封裝在編程上的作用是使對(duì)象以外的部分不能隨意存取對(duì)象的內(nèi)部數(shù)據(jù)(屬性),從而有效地避免了外部錯(cuò)誤對(duì)它的“交叉感染”。
另一方面,當(dāng)對(duì)象的內(nèi)部做了某些修改時(shí),由于它只通過少量的接口對(duì)外提供服務(wù),因此大大減少了內(nèi)部的修改對(duì)外部的影響。
面向?qū)ο笙到y(tǒng)的封裝單位是對(duì)象,類概念本身也具有封裝的意義,因?yàn)閷?duì)象的特性是由它所屬的類說明來描述的。
2 類的嚴(yán)謹(jǐn)定義
[類修飾符] class 類名 [extends 父類名] [implements 接口列表]
{
數(shù)據(jù)成員
成員方法
}
合理地使用這些可選項(xiàng),可以充分地展示封裝、繼承和信息隱藏等面向?qū)ο筇匦浴?br />
類修飾符(Qualifier):用于規(guī)定類的一些特殊性,主要是說明對(duì)它的訪問限制。
extends 父類名:指明新定義的類是由已存在的父類派生出來的。
implements 接口列表:Java 本來只支持單繼承,為了給多重繼承的軟件開發(fā)提供方便,它提供了這一接口機(jī)制。
3 類修飾符
類的修飾符用于說明對(duì)它的訪問限制,一個(gè)類可以沒有修飾符,也可以有 public、final、abstract 等幾種不同的修飾符。
3.1 無修飾符的情況
如果一個(gè)類前無修飾符,則這個(gè)類只能被同一個(gè)包里的類使用。
Java 規(guī)定,同一個(gè)程序文件中的所有類都在同一個(gè)包中。
無修飾符的類可以被同一個(gè)程序文件中的類使用,但不能被其他程序文件中的其他包中的類使用。
3.2 public 修飾符
如果一個(gè)類的修飾符是 public,則這個(gè)類是公共類。
公共類不但可供它所在包中的其他類使用,也可供其他包中的類使用。
在程序中可以用 import 語句引用其他包中的 public 類。
Java 規(guī)定,在一個(gè)程序文件中,只能定義一個(gè) public 類,其余的類可以是無修飾符的類,也可以是用 final 修飾符定義的最終類,否則編譯時(shí)會(huì)報(bào)錯(cuò)。
3.3 final 修飾符
用 final 修飾符修飾的類被稱為最終類。
最終類是不能被任何其他類所繼承的。
定義最終類的目的有三:
用來完成某種標(biāo)準(zhǔn)功能。將一個(gè)類定義為 final 類,則可以將它的內(nèi)容、屬性和功能固定下來,與它的類名形成穩(wěn)定的映射關(guān)系,從而保證引用這個(gè)類時(shí)所實(shí)現(xiàn)的功能是正確無誤的。
提高程序的可讀性。從父類派生子類,再?gòu)淖宇惻缮宇?,使軟件變得越來越?fù)雜。而在必要的層次上設(shè)置 final 類,可以提高程序的可讀性。
提高安全性。病毒的闖入途徑之一是在一些處理關(guān)鍵信息的類中派生子類,再用子類去替代原來的類。由于用 final 修飾符定義的類不能再派生子類,截?cái)嗔瞬《娟J入的途徑,因而提高了程序的安全性。
3.4 abstract 修飾符
用 abstract 修飾符修飾的類稱為抽象類。
抽象類刻畫了研究對(duì)象的公有行為特征,并通過繼承機(jī)制將這些特征傳送給它的派生類。
其作用在于將許多有關(guān)的類組織在一起,提供一個(gè)公共的基類,為派生具體類奠定基礎(chǔ)。
此外,當(dāng)一個(gè)類中出現(xiàn)一個(gè)或多個(gè)用 abstract 修飾符定義的方法時(shí),則必須在這個(gè)類的前面加上 abstract 修飾符,將其定義為抽象類。
3.5 類修飾符使用注意事項(xiàng)
可以同時(shí)使用兩個(gè)修飾符來修飾一個(gè)類,當(dāng)使用兩個(gè)修飾符修飾一個(gè)類時(shí),這些修飾符之間用空格分開,寫在關(guān)鍵字 class 之前,修飾符的順序?qū)︻惖男再|(zhì)沒有任何影響。
需要注意的是:一個(gè)類可以為修飾為 public abstract,也可以被修飾為 public final,但不能被修飾為 abstract final,這是因?yàn)?abstract 類自身沒有對(duì)象,需要派生子類后再創(chuàng)建子類的對(duì)象,而 final 類不能派生子類,所以不存在用 abstract final 兩個(gè)修飾符修飾的類。