Java程序設計(第3版) 課件 -第二部分 類之間的關系_第1頁
Java程序設計(第3版) 課件 -第二部分 類之間的關系_第2頁
Java程序設計(第3版) 課件 -第二部分 類之間的關系_第3頁
Java程序設計(第3版) 課件 -第二部分 類之間的關系_第4頁
Java程序設計(第3版) 課件 -第二部分 類之間的關系_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論