- 面向物聯(lián)網(wǎng)的Android應(yīng)用開發(fā)與實踐
- 廖建尚等
- 4077字
- 2020-09-29 17:16:20
5.3 原理學(xué)習(xí):Java的對象與類、接口實現(xiàn)與包機制
5.3.1 Java的對象與類
1. 對象與類的定義
(1)Java的對象。現(xiàn)實世界有很多對象,如貓、狗等,這些對象都有自己的狀態(tài)和行為,如貓的狀態(tài)有名字、品種和顏色等,貓的行為有叫、搖尾巴和跑等。
軟件對象也有狀態(tài)和行為。軟件對象的狀態(tài)就是屬性,行為可以通過方法來實現(xiàn)。在軟件開發(fā)中,方法可以改變對象內(nèi)部的狀態(tài),對象之間的相互調(diào)用也是通過方法來完成的。
(2)Java的類。類可以看成創(chuàng)建對象的模板,一個類通常包含以下類型變量:
① 局部變量:在方法、構(gòu)造函數(shù)或者語句塊中定義的變量被稱為局部變量,變量聲明和初始化都是在方法中實現(xiàn)的,方法結(jié)束后,局部變量會被自動銷毀。
② 成員變量:成員變量是定義在類中、方法外的變量。成員變量在創(chuàng)建對象時被實例化,成員變量可以被類中方法、構(gòu)造函數(shù)和特定類的語句塊訪問。
③ 類變量:類變量在類中、方法外聲明,必須聲明為靜態(tài)類型。
(3)定義構(gòu)造函數(shù)。每個類都有構(gòu)造函數(shù)。如果沒有顯式地為類定義構(gòu)造函數(shù),則Java編譯器會為該類提供一個默認構(gòu)造函數(shù)。在創(chuàng)建一個對象時,至少要調(diào)用一個構(gòu)造函數(shù)。構(gòu)造函數(shù)的名稱必須與類名相同,一個類可以有多個構(gòu)造函數(shù)。下面是一個構(gòu)造函數(shù)的示例。

(4)創(chuàng)建對象。對象是根據(jù)類創(chuàng)建的,在Java中,可以使用關(guān)鍵字new來創(chuàng)建一個對象。創(chuàng)建對象需要以下三步:
① 聲明:聲明一個對象,包括對象名稱和對象類型。
② 實例化:使用new創(chuàng)建一個對象。
③ 初始化:在使用new創(chuàng)建對象時,會調(diào)用構(gòu)造函數(shù)來初始化對象。
下面是一個創(chuàng)建對象的示例。

(5)訪問變量和方法。在Java中,可以通過已創(chuàng)建的對象來訪問類中的變量和方法,如下所示。

(6)源文件的聲明規(guī)則。如果要在一個源文件中定義多個類,并且還有import語句和package語句,則應(yīng)遵守以下聲明規(guī)則:
① 一個源文件中只能有一個public類。
② 一個源文件可以有多個非public類。
③ 源文件的名稱應(yīng)該和public類的名稱保持一致。例如,若源文件中public類的名稱是Dog,則源文件應(yīng)該命名為Dog.java。
④ 如果一個類定義在某個包中,則package語句應(yīng)該在源文件的首行。
⑤ 如果源文件包含import語句,則該語句應(yīng)該放在package語句和類定義之間;如果沒有package語句,則import語句應(yīng)該放在源文件中最前面。
⑥ import語句和package語句在源文件中定義的所有類都有效。
(7)Java包。將功能相似或相關(guān)的類和接口放在同一個包中,可以方便類和接口的查找及使用,對類和接口進行分類。當(dāng)開發(fā)Java程序時,可能會涉及很多類和接口,因此有必要對類和接口進行分類。
(8)import語句。import語句用來提供一個合理的目錄,使得編譯器可以找到某個類。例如,采用下面的語句可以載入Java安裝目錄“/java/io”下的所有類。

2. Java常用類介紹
(1)Java類庫的結(jié)構(gòu)。類庫就是Java API,是系統(tǒng)提供的標準類的集合。Java類庫中的類和接口大多封裝在特定的包里,每個包具有自己的功能。表5.1列出了Java中的常用包,其中,包名后面帶“.*”的表示其中包括一些相關(guān)的包,通過查閱Java技術(shù)文檔可以了解更多的類庫。
表5.1 Java中的常用包

除了java.lang,其他的包都需要用import語句導(dǎo)入之后才能使用。
(2)基本數(shù)據(jù)類型的類。java.lang不僅包含了Object類,java.lang.Object類是Java中整個類層次結(jié)構(gòu)的根節(jié)點,還定義了基本數(shù)據(jù)類型的類,如Boolean、Character、Byte、Integer、Short、Long、Float和Double等,這些類支持基本數(shù)據(jù)類型的轉(zhuǎn)換,如表5.2所示。
表5.2 基本數(shù)據(jù)類型的類

(3)String類和StringBuffer類。Java字符串是由String類和StringBuffer類來處理的。Java中的字符串屬于String類,雖然可以用其他方法表示字符串,但使用String類作為字符串的標準格式,Java編譯器可以把字符串轉(zhuǎn)換成String對象。如果需要進行大量的字符串操作,就可以使用StringBuffer類或字符數(shù)組。
StringBuffer類與String類相似,它具有String類的很多功能。StringBuffer對象可以在緩沖區(qū)內(nèi)被修改,如增加、替換字符或子字符串。在完成緩沖字符串?dāng)?shù)據(jù)操作后,可以通過StringBuffer.toString方法或String類的構(gòu)造函數(shù)將字符串轉(zhuǎn)換成標準字符串格式。
(4)System類。System類是一個特殊類,它是一個公共最終類,不能被繼承,也不能被實例化,即不能創(chuàng)建System對象。System類功能強大,與Java運行時一起可以訪問許多有用的系統(tǒng)功能。System類是保存靜態(tài)方法和變量的集合,標準的輸入、輸出和Java運行時的錯誤輸出都存儲在變量in、out和err中。System類中所有的變量和方法都是靜態(tài)的,使用時以System作為前綴,如“System.變量名”和“System.方法名”。
(5)Math類。Math類提供了用于基本數(shù)學(xué)運算的屬性和方法。
(6)Vector類。當(dāng)創(chuàng)建過大的數(shù)組時,會造成空間的浪費。Java中的java.util包提供了Vector類,通過該類可以根據(jù)需要創(chuàng)建動態(tài)數(shù)組。另外,Vector類還提供了一些有用的方法,如增加和刪除元素的方法。
(7)Stack類。Stack類是Vector類的一個子類,用于實現(xiàn)后進先出的堆棧。Stack類定義了創(chuàng)建空堆棧的構(gòu)造函數(shù),不僅包括由Vector類定義的所有方法,還增加了幾種它自己定義的方法。
(8)ArrayList類。ArrayList是一個容量能夠動態(tài)變化的動態(tài)數(shù)組,它繼承自AbstractList類,實現(xiàn)了List、RandomAccess、Cloneable、java.io.Serializable等接口。
ArrayList類適合隨機訪問元素,但在數(shù)組中插入和刪除元素的效率較低。由于ArrayList類不是線程安全的,因此該類適合在單線程中使用,而在多線程中則使用Vector類或者CopyOnWriteArrayList類。
(9)HashMap類和HashSet類。HashMap類和HashSet類是Java集合框架(Collection Framework)中的兩個重要成員,HashMap是Map接口的常用實現(xiàn)類,HashSet是Set接口的常用實現(xiàn)類。
3. 繼承
繼承允許創(chuàng)建不同等級的類,子類可以繼承父類的特征和行為,從而使得子類的對象(實例)具有父類的實例域和方法。子類也可以從父類繼承方法,使得子類與父類具有相同的行為。
Java可以通過關(guān)鍵字extends來聲明一個類是從另外一個類繼承而來的,格式如下:

(1)繼承的特性。
① 子類擁有父類非private的屬性和方法。
② 子類可以擁有自己的屬性和方法,即子類可以對父類進行擴展。
③ 子類可以用自己的方式實現(xiàn)父類的方法。
④ Java的繼承是單繼承,但是可以多重繼承。單繼承是指一個子類只能繼承一個父類;多重繼承是指多層次的繼承,如B類繼承A類、C類繼承B類,按照關(guān)系來說,B類是C類的父類,A類是B類的父類。
⑤ 繼承可以提高類之間的耦合性,但耦合度高就會造成代碼之間的聯(lián)系變得緊密,使獨立性變差。
(2)繼承的關(guān)鍵字。Java可以通過關(guān)鍵字extends和implements來實現(xiàn)繼承。在Java中,所有的類都繼承自O(shè)bject,如果一個類沒有使用繼承的兩個關(guān)鍵字,則默認為繼承自O(shè)bject類。
① extends關(guān)鍵字。類的繼承是單一繼承,一個子類只能擁有一個父類,所以extends只能繼承自一個類。
② implements關(guān)鍵字。使用implements關(guān)鍵字可以變相地使Java具有多繼承的特性,適用于繼承接口的情況,可以同時繼承多個接口。
③ super與this關(guān)鍵字。通過super關(guān)鍵字可以訪問父類成員,用來引用當(dāng)前對象的父類;this關(guān)鍵字用于指向自己的引用。
④ final關(guān)鍵字。使用final關(guān)鍵字聲明的類是不能被繼承的,為最終類;使用final關(guān)鍵字修飾的類的方法不能被該類的子類覆寫;定義為final的實例變量不能被修改;被聲明為final類,其方法將會被自動聲明為final,但實例變量并不是final。
(3)構(gòu)造函數(shù)。子類不能繼承父類的構(gòu)造函數(shù)。如果父類的構(gòu)造函數(shù)帶有參數(shù),則必須在子類的構(gòu)造函數(shù)中顯式地通過super關(guān)鍵字調(diào)用父類的構(gòu)造函數(shù)并配以適當(dāng)?shù)膮?shù)列表;如果父類的構(gòu)造函數(shù)沒有參數(shù),則在子類的構(gòu)造函數(shù)中通過super關(guān)鍵字調(diào)用父類構(gòu)造函數(shù)不是必需的,如果沒有使用super關(guān)鍵字,系統(tǒng)會自動調(diào)用父類的無參構(gòu)造函數(shù)。
4. 封裝
封裝是一種將抽象性函數(shù)接口的實現(xiàn)細節(jié)部分包裝、隱藏起來的方法。適當(dāng)?shù)姆庋b可以讓代碼變得更容易理解與維護。
(1)封裝的優(yōu)點。
① 良好的封裝能夠減少耦合。
② 可以對成員變量進行更精確的控制。
③ 可以隱藏實現(xiàn)細節(jié)。
(2)實現(xiàn)Java封裝的步驟
① 通過修改屬性的可見性來限制對屬性的訪問(一般限制為private)。例如:

② 對每個屬性提供對外的公共方法,也就是創(chuàng)建一對賦/取值方法,用于對私有屬性進行訪問。例如:

5.3.2 Java的接口
1. 接口的定義
接口是一個抽象類型,是抽象方法的集合,接口通常用interface關(guān)鍵字來聲明。一個類可以通過繼承接口的方式來繼承接口的抽象方法。
接口并不是類,編寫接口的方式和類很相似,但是它們屬于不同的概念。類描述的是對象的屬性和方法,接口則包含類要實現(xiàn)的方法。除非實現(xiàn)接口的類是抽象類,否則該類要定義接口中的所有方法。接口無法被實例化,但是可以被實現(xiàn)。在類實現(xiàn)接口時,必須實現(xiàn)接口內(nèi)所描述的所有方法,否則就必須聲明為抽象類。另外,在Java中,接口類型可用來聲明一個變量。
2. 接口的聲明
interface關(guān)鍵字用來聲明一個接口,格式如下:

接口具有以下特性:
(1)接口是隱式抽象的,當(dāng)聲明一個接口時,不必使用abstract關(guān)鍵字。
(2)接口中每一個方法也是隱式抽象的,在聲明接口中的方法時同樣也不必使用abstract關(guān)鍵字。
(3)接口中的方法都是公有的。
3. 接口的實現(xiàn)
當(dāng)類實現(xiàn)接口時,類要實現(xiàn)接口中所有的方法,否則該類必須聲明為抽象類。類使用implements關(guān)鍵字實現(xiàn)接口,在類聲明中,implements關(guān)鍵字應(yīng)放在class聲明后面。實現(xiàn)一個接口的格式如下:

例如:

在覆寫接口中聲明的方法時,需要注意以下規(guī)則:
① 類在實現(xiàn)接口的方法時,不能拋出強制性異常,只能在接口中或者繼承接口的抽象類中拋出該強制性異常。
② 類在覆寫方法時要保持方法名的一致,并且應(yīng)該保持相同或者相兼容的返回值類型。
③ 如果實現(xiàn)接口的類是抽象類,就沒必要實現(xiàn)該接口的方法。
在實現(xiàn)接口時,也要注意以下規(guī)則:
① 一個類可以同時實現(xiàn)多個接口。
② 一個類只能繼承一個類,但能實現(xiàn)多個接口。
③ 一個接口能繼承另一個接口。
4. 接口的繼承
一個接口能繼承另一個接口,接口的繼承使用extends關(guān)鍵字。下面的Animal接口被Bird和Fish接口繼承:

Bird接口聲明了1個方法,從Animal接口繼承了2個方法,這樣在實現(xiàn)Bird接口的類時需要實現(xiàn)3個方法。
5. 接口的多繼承
類的多繼承是不合法的,但接口允許多繼承。在接口的多繼承中,extends關(guān)鍵字只需要使用一次,在其后跟著繼承接口即可。例如:

上述語句定義的子接口是合法的。與類不同的是,接口允許多繼承。
6. 標記接口
最常用的繼承接口是不包含任何方法的接口,不包含任何方法的接口稱為標記接口。標記接口是一種不包含任何方法和屬性的接口,僅僅表明它的類屬于一個特定的類型。標記接口的作用是給某個對象打個“標”,使對象擁有某個或某些特權(quán)。例如,java.awt.event包中的MouseListener接口繼承自java.util.EventListener接口,定義如下:

標記接口主要用于以下兩種場合。
(1)建立一個公共的父接口:如EventListener接口,這是由幾十個其他接口擴展的Java API,可以使用一個標記接口來建立一組接口的父接口。
(2)向一個類添加數(shù)據(jù)類型:實現(xiàn)標記接口的類不需要定義任何接口方法,但該類可通過多態(tài)性變成一個接口類型。
- Getting Started with Citrix XenApp? 7.6
- Visual Basic程序設(shè)計教程
- UI智能化與前端智能化:工程技術(shù)、實現(xiàn)方法與編程思想
- Access 2010數(shù)據(jù)庫基礎(chǔ)與應(yīng)用項目式教程(第3版)
- Oracle BAM 11gR1 Handbook
- PHP+MySQL+Dreamweaver動態(tài)網(wǎng)站開發(fā)實例教程
- PhpStorm Cookbook
- Linux Device Drivers Development
- Mastering Android Development with Kotlin
- OpenGL Data Visualization Cookbook
- Android應(yīng)用開發(fā)深入學(xué)習(xí)實錄
- Python期貨量化交易實戰(zhàn)
- Mastering Gephi Network Visualization
- C++程序設(shè)計
- Learning Jakarta Struts 1.2: a concise and practical tutorial