Java程序設(shè)計(jì)(第3版) 課件 -第二部分 類(lèi)之間的關(guān)系_第1頁(yè)
Java程序設(shè)計(jì)(第3版) 課件 -第二部分 類(lèi)之間的關(guān)系_第2頁(yè)
Java程序設(shè)計(jì)(第3版) 課件 -第二部分 類(lèi)之間的關(guān)系_第3頁(yè)
Java程序設(shè)計(jì)(第3版) 課件 -第二部分 類(lèi)之間的關(guān)系_第4頁(yè)
Java程序設(shè)計(jì)(第3版) 課件 -第二部分 類(lèi)之間的關(guān)系_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第二部分類(lèi)之間的關(guān)系第8章關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系的表示關(guān)聯(lián)關(guān)系是一種“有”的關(guān)系,也就是說(shuō),如果A類(lèi)的一個(gè)屬性是B類(lèi),那么就可以說(shuō)A類(lèi)對(duì)象“有”一個(gè)B類(lèi)對(duì)象,即A類(lèi)關(guān)聯(lián)B類(lèi)。Java語(yǔ)言中,如果A類(lèi)關(guān)聯(lián)B類(lèi),那么表現(xiàn)形式如下:簡(jiǎn)言之,A類(lèi)關(guān)聯(lián)B類(lèi),即B類(lèi)對(duì)象作為A類(lèi)對(duì)象的屬性存在。如果實(shí)例化A類(lèi)對(duì)象,那么就會(huì)為之實(shí)例化一個(gè)B類(lèi)對(duì)象。所以說(shuō)關(guān)聯(lián)關(guān)系是“有”的關(guān)系,即每個(gè)A類(lèi)對(duì)象都有一個(gè)B類(lèi)對(duì)象作為其屬性存在。關(guān)聯(lián)關(guān)系的方向關(guān)聯(lián)關(guān)系可以分為單向關(guān)聯(lián)和雙向關(guān)聯(lián)兩種,如果有A類(lèi)和B類(lèi),所謂單向關(guān)聯(lián)即B類(lèi)作為A類(lèi)的屬性存在,但A類(lèi)不是B類(lèi)的屬性。如以下代碼:第8章關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系的多重性除了從方向上考慮,還可以從多重性方面考慮關(guān)聯(lián)關(guān)系。常見(jiàn)的關(guān)聯(lián)關(guān)系有一對(duì)一關(guān)聯(lián)和一對(duì)多關(guān)聯(lián)。例如,如果一個(gè)員工對(duì)象只能在一個(gè)部門(mén)中,那么員工和部門(mén)之間就是一對(duì)一的關(guān)聯(lián)關(guān)系;如果一個(gè)員工可以同時(shí)掛職在多個(gè)部門(mén),那么員工和部門(mén)之間就是一對(duì)多的關(guān)聯(lián)關(guān)系?,F(xiàn)實(shí)中,一對(duì)多的關(guān)聯(lián)關(guān)系遠(yuǎn)多于一對(duì)一的關(guān)聯(lián)關(guān)系,例如,一個(gè)系有多個(gè)專(zhuān)業(yè),一個(gè)專(zhuān)業(yè)有多個(gè)班,一個(gè)班有多名學(xué)生,一名學(xué)生選多門(mén)課程等。顯而易見(jiàn),如果A類(lèi)和B類(lèi)是一對(duì)多的關(guān)聯(lián)關(guān)系,那么就需要在A類(lèi)中引用多個(gè)B類(lèi)的對(duì)象。而如何對(duì)多個(gè)B類(lèi)對(duì)象進(jìn)行管理,是必須解決的問(wèn)題。解決一對(duì)多的關(guān)聯(lián)關(guān)系,“多”的這方對(duì)象一定需要用另外一個(gè)對(duì)象進(jìn)行“持有”,或者稱(chēng)為“容納”,否則無(wú)法進(jìn)行管理。Java語(yǔ)言中能承擔(dān)“數(shù)據(jù)容器”任務(wù)的對(duì)象有兩種:數(shù)組和集合。第8章關(guān)聯(lián)關(guān)系數(shù)組1.?dāng)?shù)組的定義數(shù)組是類(lèi)型相同的元素的集合,可以存儲(chǔ)任何數(shù)據(jù)類(lèi)型,但是只有類(lèi)型相同的元素才可存到一個(gè)數(shù)組中。2.?dāng)?shù)組的類(lèi)型數(shù)組是引用類(lèi)型。數(shù)組中存儲(chǔ)的元素可能是基本數(shù)據(jù)類(lèi)型,也可能是引用類(lèi)型,但是數(shù)組對(duì)象本身是引用類(lèi)型,即對(duì)象。3.?dāng)?shù)組的聲明Java語(yǔ)言中,數(shù)組的聲明方式有兩種。如以下代碼:第8章關(guān)聯(lián)關(guān)系數(shù)組的創(chuàng)建及長(zhǎng)度聲明數(shù)組后,數(shù)組對(duì)象還只是一個(gè)空指針,不能使用。要使用數(shù)組,必須先創(chuàng)建數(shù)組。本節(jié)主要介紹數(shù)組的創(chuàng)建方法。1.?dāng)?shù)組的創(chuàng)建數(shù)組是引用類(lèi)型,因此也需要使用new關(guān)鍵字創(chuàng)建,創(chuàng)建時(shí)必須指定數(shù)組的長(zhǎng)度,長(zhǎng)度是數(shù)組中能存儲(chǔ)的元素個(gè)數(shù)。如以下代碼:上述代碼中,數(shù)組i被創(chuàng)建為一個(gè)長(zhǎng)度為3的int型數(shù)組對(duì)象,emp1被創(chuàng)建為長(zhǎng)度為2的Employee數(shù)組對(duì)象。數(shù)組創(chuàng)建后,即為數(shù)組的元素分配了內(nèi)存空間,并為每個(gè)元素進(jìn)行了初始化,初始值為元素對(duì)應(yīng)的數(shù)據(jù)類(lèi)型的默認(rèn)值。例如,數(shù)組i中的3個(gè)元素均被初始化為0,數(shù)組emp1中的兩個(gè)元素均被初始化為null。第8章關(guān)聯(lián)關(guān)系數(shù)組的創(chuàng)建及長(zhǎng)度2.?dāng)?shù)組的長(zhǎng)度創(chuàng)建數(shù)組時(shí)必須指定數(shù)組的長(zhǎng)度,而且長(zhǎng)度值會(huì)直接初始化到內(nèi)存中。例如,雖然c=newchar[5];創(chuàng)建的數(shù)組c長(zhǎng)度為5,但是分配的內(nèi)存空間卻是6塊,其中除了5個(gè)數(shù)組元素外,另一個(gè)空間存儲(chǔ)了數(shù)組的長(zhǎng)度,如圖所示。訪(fǎng)問(wèn)數(shù)組的長(zhǎng)度不需要調(diào)用方法,使用數(shù)組的length屬性即可。如c.length直接返回?cái)?shù)組c的長(zhǎng)度,值為5。第8章關(guān)聯(lián)關(guān)系數(shù)組元素的訪(fǎng)問(wèn)數(shù)組是用來(lái)存儲(chǔ)其他變量的對(duì)象,所以在實(shí)際應(yīng)用中,不可避免地需要訪(fǎng)問(wèn)數(shù)組中的元素。往往使用索引訪(fǎng)問(wèn)數(shù)組中的元素,索引值從0開(kāi)始。如以下代碼:上述代碼中的數(shù)組a的長(zhǎng)度為3,所以可以使用索引0、1、2訪(fǎng)問(wèn)數(shù)組的第一個(gè)到第三個(gè)元素,進(jìn)行賦值等操作。除了對(duì)數(shù)組中的元素進(jìn)行賦值,還常常遍歷數(shù)組中的元素。遍歷數(shù)組中的元素有兩種方式:一種是傳統(tǒng)for循環(huán),另一種是增強(qiáng)for循環(huán)。如以下代碼:第8章關(guān)聯(lián)關(guān)系數(shù)組的賦值數(shù)組必須進(jìn)行賦值才能使用,本節(jié)將介紹數(shù)組賦值的3種方式。1.聲明的同時(shí),使用new關(guān)鍵字創(chuàng)建。如以下代碼:第8章關(guān)聯(lián)關(guān)系使用new關(guān)鍵字創(chuàng)建數(shù)組時(shí),將為數(shù)組元素賦默認(rèn)值。如數(shù)組eArray1的長(zhǎng)度為2,其中的兩個(gè)元素是Employee類(lèi)型,元素值被賦為引用類(lèi)型的默認(rèn)值null。2.聲明的同時(shí),直接使用{}賦值。如以下代碼:可以在聲明數(shù)組的同時(shí),使用{}對(duì)數(shù)組中的元素直接賦值。如eArray2的兩個(gè)元素被賦值為newEmployee("Grace")和newEmployee("Alice")對(duì)象。3.使用new[]{}直接賦值。如以下代碼:除了可以使用{}直接對(duì)數(shù)組元素賦值,還可以使用new[]{}為數(shù)組元素賦值。區(qū)別在于,{}必須在聲明數(shù)組的同時(shí)賦值,而new[]{}不僅可以在聲明數(shù)組的同時(shí)賦值,還可以在數(shù)組聲明后,在其他語(yǔ)句行中為數(shù)組賦值。多維數(shù)組聲明一個(gè)二維int型數(shù)組可以有以下3種方式。建議使用第一種方式進(jìn)行聲明,具有較好的可讀性。如圖所示的是一個(gè)二維數(shù)組的創(chuàng)建過(guò)程。第8章關(guān)聯(lián)關(guān)系數(shù)組的復(fù)制在JDKAPI的System類(lèi)中,提供了一個(gè)復(fù)制數(shù)組的靜態(tài)方法。代碼如下:該方法可以從一個(gè)源數(shù)組的特定位置,將指定個(gè)數(shù)的元素復(fù)制到目標(biāo)數(shù)組的指定位置。如以下代碼:第8章關(guān)聯(lián)關(guān)系A(chǔ)rrays類(lèi)JavaAPI的java.util包中提供了數(shù)組的工具類(lèi)Arrays。該類(lèi)中的所有方法都是靜態(tài)方法,可以對(duì)數(shù)組進(jìn)行操作,主要有以下幾種。1.二分查找(binarySearch)本類(lèi)中提供了大量的二分查找方法,可以在數(shù)組中查找指定值的元素,返回該元素的索引值。如:2.填充(fill)本類(lèi)中提供了大量的填充方法,可以對(duì)數(shù)組中指定范圍的元素使用指定的值填充。如:3.排序(sort)本類(lèi)中提供了大量的排序方法,可以對(duì)數(shù)組中的元素進(jìn)行排序。如:第8章關(guān)聯(lián)關(guān)系依賴(lài)關(guān)系是類(lèi)與類(lèi)之間另一種常見(jiàn)的關(guān)系??梢詫⑦@種關(guān)系理解為“USE-A”關(guān)系,即“使用”關(guān)系。Java語(yǔ)言中依賴(lài)關(guān)系的表示依賴(lài)關(guān)系是一種“使用”關(guān)系,如果A類(lèi)對(duì)象的某個(gè)方法的參數(shù)是B類(lèi)對(duì)象,那么就可以說(shuō)A類(lèi)依賴(lài)B類(lèi)。如以下代碼:第9章依賴(lài)關(guān)系上述代碼中,A類(lèi)方法f的形式參數(shù)類(lèi)型是B類(lèi)類(lèi)型,也就是說(shuō),A類(lèi)對(duì)象如果要使用方法f,那么必須有一個(gè)B類(lèi)對(duì)象作為參數(shù)方可實(shí)現(xiàn),這種情形被稱(chēng)為A類(lèi)依賴(lài)B類(lèi)。依賴(lài)與關(guān)聯(lián)的區(qū)別關(guān)聯(lián)關(guān)系是面向?qū)ο蟪绦蛟O(shè)計(jì)中常用的復(fù)用策略,依賴(lài)關(guān)系相對(duì)于關(guān)聯(lián)關(guān)系是一種“簡(jiǎn)單”的關(guān)系,本節(jié)將比較兩種關(guān)系的不同。1.關(guān)聯(lián)關(guān)系是“HAS”關(guān)系,依賴(lài)關(guān)系是“USE”關(guān)系A(chǔ)類(lèi)關(guān)聯(lián)B類(lèi),指的是B類(lèi)對(duì)象作為A類(lèi)對(duì)象的屬性存在,稱(chēng)為“HAS”關(guān)系。A類(lèi)依賴(lài)B類(lèi),指的是B類(lèi)對(duì)象作為A類(lèi)對(duì)象的方法參數(shù)存在,稱(chēng)為“USE”關(guān)系。2.生命周期不同如果A類(lèi)關(guān)聯(lián)B類(lèi),那么創(chuàng)建A類(lèi)對(duì)象時(shí)就會(huì)實(shí)例化B類(lèi)對(duì)象,直到A類(lèi)對(duì)象被銷(xiāo)毀,所關(guān)聯(lián)的B類(lèi)對(duì)象才被銷(xiāo)毀,即只要A類(lèi)對(duì)象存在,B類(lèi)對(duì)象就存在。而如果A類(lèi)依賴(lài)B類(lèi),那么只有當(dāng)A類(lèi)對(duì)象調(diào)用到相應(yīng)方法時(shí),B類(lèi)對(duì)象才被臨時(shí)創(chuàng)建,方法執(zhí)行結(jié)束,B類(lèi)對(duì)象即被回收,A類(lèi)和B類(lèi)之間的依賴(lài)關(guān)系是一種瞬時(shí)關(guān)系。第9章依賴(lài)關(guān)系Java語(yǔ)言的繼承在Java語(yǔ)言中,如果B類(lèi)是在A類(lèi)的基礎(chǔ)上衍生出來(lái)的,即B類(lèi)不僅擁有A類(lèi)的所有屬性和方法,還擴(kuò)展了新的屬性或方法,那么就可以讓B類(lèi)繼承A類(lèi),以達(dá)到重復(fù)使用A類(lèi)的目的??梢哉f(shuō),繼承關(guān)系是關(guān)聯(lián)關(guān)系之外的另一種面向?qū)ο蟮膹?fù)用策略。Java語(yǔ)言中,類(lèi)與類(lèi)之間使用關(guān)鍵字extends來(lái)表示繼承關(guān)系。如以下代碼:由于圓形和三角形都是圖形,都具有圖形的屬性和方法,所以圓形和三角形可以作為圖形的子類(lèi)存在。上述代碼中,形狀Shape是父類(lèi),定義了方法draw。而圓形Circle和三角形Triangle是Shape類(lèi)的子類(lèi),使用extends關(guān)鍵字繼承了父類(lèi)Shape。如此一來(lái),Circle和Triangle也擁有了方法draw,而且Circle和Triangle又分別擴(kuò)展了新的方法,用來(lái)獲取直徑和面積。值得注意的是,Java語(yǔ)言中類(lèi)與類(lèi)之間的繼承關(guān)系是單繼承,即一個(gè)類(lèi)最多只能繼承一個(gè)父類(lèi),而一個(gè)父類(lèi)可以同時(shí)有多個(gè)子類(lèi)。單繼承可以避免調(diào)用混亂。第10章繼承關(guān)系繼承中構(gòu)造方法的調(diào)用面向?qū)ο蟮恼Z(yǔ)言中,一切都以對(duì)象為基礎(chǔ),類(lèi)的使用都是從創(chuàng)建對(duì)象開(kāi)始的,而創(chuàng)建對(duì)象都離不開(kāi)調(diào)用構(gòu)造方法。在繼承關(guān)系中,創(chuàng)建子類(lèi)對(duì)象時(shí)構(gòu)造方法的調(diào)用順序需遵守一定的規(guī)則。方法覆蓋方法覆蓋(override)也稱(chēng)方法重寫(xiě),是繼承中非常重要的知識(shí)點(diǎn)。如果子類(lèi)需要修改從父類(lèi)繼承到的方法的方法體,就可以使用方法覆蓋。方法覆蓋允許子類(lèi)對(duì)父類(lèi)中的方法進(jìn)行重寫(xiě),子類(lèi)對(duì)象能夠自動(dòng)調(diào)用子類(lèi)重寫(xiě)的方法。接下來(lái)通過(guò)Employee類(lèi)的例子介紹方法覆蓋。抽象類(lèi)1.抽象類(lèi)往往用來(lái)做父類(lèi)抽象類(lèi)不能被實(shí)例化,往往用來(lái)做父類(lèi),定義子類(lèi)中公有的屬性和方法。子類(lèi)繼承抽象類(lèi)后,可以復(fù)用其中的屬性和方法。2.抽象類(lèi)可以作為數(shù)據(jù)類(lèi)型使用抽象類(lèi)不能創(chuàng)建對(duì)象。3.抽象類(lèi)可以使用類(lèi)名直接調(diào)用其靜態(tài)成員如果抽象類(lèi)中存在靜態(tài)成員,依然可以使用抽象類(lèi)的類(lèi)名直接調(diào)用。抽象類(lèi)不能創(chuàng)建對(duì)象。4.抽象類(lèi)需要有構(gòu)造方法抽象類(lèi)雖然不能被實(shí)例化,但是依然需要有構(gòu)造方法。因?yàn)槌橄箢?lèi)往往作為父類(lèi)使用,而子類(lèi)的構(gòu)造方法總要調(diào)用父類(lèi)的構(gòu)造方法。如果沒(méi)有為抽象類(lèi)顯式聲明構(gòu)造方法,抽象類(lèi)也存在默認(rèn)無(wú)參的構(gòu)造方法。第10章繼承關(guān)系抽象方法抽象類(lèi)里常常會(huì)聲明抽象方法,本節(jié)將介紹抽象方法的概念和使用。前面章節(jié)中提及了子類(lèi)Sales覆蓋了父類(lèi)Employee中的setSalary方法,假設(shè)Engineer類(lèi)也需要覆蓋Employee類(lèi)中的setSalary方法,代碼如下:第10章繼承關(guān)系抽象方法1.抽象方法與抽象類(lèi)之間的關(guān)系有抽象方法的類(lèi)一定是抽象類(lèi),抽象類(lèi)中卻不一定有抽象方法。抽象方法是沒(méi)有方法體的方法,那么抽象方法所在的類(lèi)就無(wú)法實(shí)例化,所以有抽象方法的類(lèi)一定是抽象類(lèi)。只要一個(gè)類(lèi)不應(yīng)該被實(shí)例化,就可以聲明為抽象類(lèi),與其是否有抽象方法無(wú)關(guān),所以抽象類(lèi)中不一定有抽象方法。2.抽象方法往往被子類(lèi)實(shí)現(xiàn)“怎么做”往往在子類(lèi)中實(shí)現(xiàn)。如果子類(lèi)忽略父類(lèi)中的抽象方法,不去加以實(shí)現(xiàn),根據(jù)“有抽象方法的類(lèi)一定是抽象類(lèi)”的原則,子類(lèi)就必須聲明為抽象類(lèi),否則將出現(xiàn)編譯錯(cuò)誤。第10章繼承關(guān)系多態(tài)性多態(tài)指聲明形式一致,實(shí)現(xiàn)方式卻不同。Java語(yǔ)言中的多態(tài)性有以下3種體現(xiàn)。1.方法重載前面章節(jié)介紹了方法重載的概念。方法重載指一個(gè)類(lèi)中有多個(gè)同名但是不同參數(shù)的方法。例如,Employee類(lèi)中的兩個(gè)setSalary方法,名稱(chēng)完全相同,區(qū)別在于參數(shù)不同。調(diào)用重載方法時(shí),Java虛擬機(jī)將根據(jù)參數(shù)自動(dòng)綁定到對(duì)應(yīng)的方法。2.方法覆蓋前面章節(jié)介紹了方法覆蓋的概念。方法覆蓋是繼承關(guān)系中的概念,子類(lèi)可以重寫(xiě)父類(lèi)中的方法,子類(lèi)中的方法必須與父類(lèi)中的方法名稱(chēng)相同、參數(shù)相同、返回值類(lèi)型相同,且子類(lèi)中的方法的訪(fǎng)問(wèn)權(quán)限不能比父類(lèi)中的小,可以等同或擴(kuò)大。使用子類(lèi)對(duì)象調(diào)用被子類(lèi)覆蓋的方法時(shí),將自動(dòng)綁定到對(duì)應(yīng)子類(lèi)中的方法,如果調(diào)用沒(méi)有被子類(lèi)覆蓋的方法,則調(diào)用父類(lèi)中的方法。3.多態(tài)參數(shù)多態(tài)參數(shù)是多態(tài)性的另一種體現(xiàn),也是使用較多的一種方式。多態(tài)參數(shù),即方法的形式參數(shù)類(lèi)型是父類(lèi)類(lèi)型,而傳遞的實(shí)際參數(shù)可以是任意子類(lèi)的對(duì)象。第10章繼承關(guān)系第10章繼承關(guān)系this和super關(guān)鍵字this和super是Java語(yǔ)言中的兩個(gè)關(guān)鍵字,其中super是在繼承關(guān)系中使用的關(guān)鍵字,此節(jié)對(duì)兩個(gè)關(guān)鍵字進(jìn)行介紹。1.this關(guān)鍵字this關(guān)鍵字有兩種使用方式。一種使用方式是作為本類(lèi)當(dāng)前的引用,用來(lái)調(diào)用本類(lèi)的屬性和方法,常見(jiàn)的是用來(lái)區(qū)分同名的方法參數(shù)和屬性。2.super關(guān)鍵字super關(guān)鍵字都在子類(lèi)中使用,有兩種使用方式。一種使用方式是作為父類(lèi)的引用,用來(lái)調(diào)用父類(lèi)中的屬性或方法。如Sales類(lèi)需要覆蓋父類(lèi)Employee中的setSalary(double)方法,使薪資調(diào)整方式不變,僅增加記錄日志功能。也就是說(shuō),子類(lèi)Sales的setSalary(double)方法首先調(diào)用父類(lèi)中的setSalary(double)方法,然后增加日志功能。這時(shí)候就可以使用super關(guān)鍵字來(lái)調(diào)用父類(lèi)中的方法第10章繼承關(guān)系final在繼承中的使用final修飾變量后,變量成為常量,賦值后不能被修改。另外,final還可以修飾類(lèi)和方法。如果一個(gè)類(lèi)被final修飾,則稱(chēng)為終極類(lèi),該類(lèi)不允許被繼承。API中有大量final類(lèi),如String類(lèi)。如果一個(gè)方法被final修飾,則稱(chēng)為終極方法,該方法不能被子類(lèi)覆蓋。如果一個(gè)類(lèi)中的所有方法都是final方法,那么等同于類(lèi)聲明為final類(lèi)嗎?答案是否定的。即使一個(gè)類(lèi)中的所有方法都是final方法,該類(lèi)還是可以作為父類(lèi)被繼承,final方法也可以被子類(lèi)對(duì)象使用,只不過(guò)不能被覆蓋。而類(lèi)聲明為final后,就不能做父類(lèi)了,也不能被繼承。第10章繼承關(guān)系static、abstract、final修飾符總結(jié)1.static靜態(tài)屬性:靜態(tài)屬性不綁定到某個(gè)對(duì)象,屬于整個(gè)類(lèi),且存儲(chǔ)空間不變,可以直接使用類(lèi)名調(diào)用。靜態(tài)方法:靜態(tài)方法與靜態(tài)屬性類(lèi)似,不綁定到某個(gè)對(duì)象,是所有對(duì)象共享的方法,可以直接使用類(lèi)名調(diào)用。靜態(tài)塊:靜態(tài)塊在類(lèi)加載時(shí)被調(diào)用,且只能被調(diào)用一次。2.a(chǎn)bstract抽象類(lèi):抽象類(lèi)是不能被實(shí)例化的類(lèi),往往用來(lái)做父類(lèi)。抽象方法:沒(méi)有方法體的方法是抽象方法,往往在子類(lèi)中實(shí)現(xiàn)。有抽象方法的類(lèi)一定是抽象類(lèi)。3.finalfinal類(lèi):final類(lèi)不能被繼承。final屬性:final屬性為常量,賦值后不能被修改。賦值方式有兩種,一種是聲明時(shí)賦值,另一種是在構(gòu)造方法中賦值。final方法:final方法不能被子類(lèi)覆蓋。關(guān)聯(lián)和繼承如果A類(lèi)的某些方法需要“借助”B類(lèi)的方法實(shí)現(xiàn),那么就可以將B類(lèi)作為A類(lèi)的屬性,即關(guān)聯(lián)。關(guān)聯(lián)關(guān)系通過(guò)把已存在的類(lèi)作為屬性的方式,達(dá)到重復(fù)使用的目的。如以下代碼:第10章繼承關(guān)系上述代碼中,B類(lèi)作為A類(lèi)的屬性存在,那么A類(lèi)的所有方法都可以調(diào)用B類(lèi)的方法,從而達(dá)到復(fù)用B類(lèi)的目的。如果需要為某個(gè)類(lèi)創(chuàng)建一個(gè)特殊化的版本,即某個(gè)類(lèi)是一個(gè)通用的類(lèi),而需要開(kāi)發(fā)的類(lèi)在通用的基礎(chǔ)上,還需要一些特殊化處理,這時(shí)就需要使用繼承。如本章中使用的例子:Employee類(lèi)、Sales類(lèi)、Engineer類(lèi)。其中Employee類(lèi)是一個(gè)通用的類(lèi),而Sales類(lèi)和Engineer類(lèi)是對(duì)Employee類(lèi)的特殊化處理。在實(shí)際應(yīng)用中,關(guān)聯(lián)關(guān)系比繼承關(guān)系使用得更為廣泛,但很多初學(xué)者很容易將關(guān)聯(lián)關(guān)系錯(cuò)誤地用成繼承關(guān)系。在選擇使用關(guān)聯(lián)還是繼承時(shí),關(guān)鍵要思考兩個(gè)類(lèi)到底是“HAS-A”關(guān)系還是“IS-A”關(guān)系,切忌盲目地使用繼承。Object類(lèi)中定義了一些常用的方法,任何子類(lèi)都可以直接使用或者進(jìn)行方法覆蓋。下面介紹Object類(lèi)中的兩個(gè)主要方法。1.toString方法toString方法可以將任何一個(gè)對(duì)象轉(zhuǎn)換成字符串返回,返回值的生成算法為getClass().getName()+'@'+Integer.toHexString(hashCode())。toString方法可以被很多方法自動(dòng)調(diào)用,如System.out.println方法,輸出一個(gè)引用類(lèi)型對(duì)象時(shí),將默認(rèn)調(diào)用該對(duì)象的toString方法,輸出toString方法的返回值。API中的很多類(lèi)覆蓋了toString方法,實(shí)現(xiàn)了新的算法。如String類(lèi)的toString方法返回的就是字符串的字符序列。如以下代碼:第10章繼承關(guān)系2.equals方法Object類(lèi)中的equals方法用來(lái)比較兩個(gè)引用的虛地址。當(dāng)且僅當(dāng)兩個(gè)引用在物理上是同一個(gè)對(duì)象時(shí),返回值為true,否則將返回false。如以下代碼:第10章繼承關(guān)系接口的定義Java語(yǔ)言中,可以使用interface關(guān)鍵字來(lái)聲明接口。接口的特點(diǎn)是,沒(méi)有變量,所有方法都是抽象方法??梢詫⒔涌诳闯梢粋€(gè)特殊的抽象類(lèi),特殊之處在于接口中的任何方法都必須是抽象的,而且不能聲明變量。接口編譯后,也生成.class文件。以下代碼演示接口的聲明形式:上述代碼聲明了接口Flyer,該接口中聲明了一個(gè)靜態(tài)常量TYPE,沒(méi)有任何變量;同時(shí)聲明了3個(gè)抽象方法,沒(méi)有任何具體方法。第11章實(shí)現(xiàn)關(guān)系類(lèi)與接口之間的關(guān)系:實(shí)現(xiàn)接口是抽象的,其中沒(méi)有任何具體方法和變量,所以不能進(jìn)行實(shí)例化。接口定義的是多個(gè)類(lèi)都要實(shí)現(xiàn)的操作,即“做什么”。類(lèi)可以實(shí)現(xiàn)接口,從而覆蓋接口中的方法,實(shí)現(xiàn)“怎么做”。類(lèi)實(shí)現(xiàn)接口通過(guò)使用關(guān)鍵字implements完成,然后就擁有了接口中的常量和抽象方法,所以該類(lèi)必須實(shí)現(xiàn)接口定義的抽象方法,否則類(lèi)將是抽象類(lèi),無(wú)法進(jìn)行實(shí)例化。第11章實(shí)現(xiàn)關(guān)系接口的作用接口將Java中抽象的概念進(jìn)一步發(fā)揮。接口的本質(zhì)是一個(gè)“純粹”的抽象類(lèi),即所有方法都是抽象的。接口中只定義“做什么”,將多個(gè)類(lèi)型都需要實(shí)現(xiàn)的功能進(jìn)行統(tǒng)一規(guī)范,而“怎么做”都由各實(shí)現(xiàn)類(lèi)完成,實(shí)現(xiàn)可擴(kuò)展的效果。接口的作用如下。1.實(shí)現(xiàn)多重繼承由于Java類(lèi)要求單繼承,如果沒(méi)有接口的概念,子類(lèi)一旦繼承那些“純粹”的抽象類(lèi),便不能再繼承其他類(lèi)。所以Java語(yǔ)言將“純粹”的抽象類(lèi)定義為一種類(lèi)型,即接口。類(lèi)可以同時(shí)繼承父類(lèi)以及實(shí)現(xiàn)接口,也就是說(shuō),extends和implements關(guān)鍵字可以同時(shí)使用,而且一個(gè)類(lèi)可以同時(shí)實(shí)現(xiàn)多個(gè)接口,從而實(shí)現(xiàn)對(duì)“純粹”的抽象類(lèi)的多重繼承,解決了類(lèi)與類(lèi)單繼承的局限性。2.實(shí)現(xiàn)多態(tài)性接口不能創(chuàng)建對(duì)象,但是可以作為類(lèi)型存在,因此可以實(shí)現(xiàn)多態(tài)參數(shù)。第11章實(shí)現(xiàn)關(guān)系接口的語(yǔ)法細(xì)節(jié)接口本質(zhì)上是抽象類(lèi),所以具備類(lèi)的特征,但是也有其特殊性。本節(jié)將從多個(gè)方面總結(jié)接口的一些細(xì)節(jié)特征。1.接口的訪(fǎng)問(wèn)權(quán)限類(lèi)(專(zhuān)指外部類(lèi))的訪(fǎng)問(wèn)權(quán)限有兩種:public權(quán)限和default權(quán)限。類(lèi)如果不顯式聲明public權(quán)限,則默認(rèn)為default權(quán)限。然而,接口的訪(fǎng)問(wèn)權(quán)限只能是publi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論