Java基礎(chǔ)實(shí)踐教程-繼承_第1頁
Java基礎(chǔ)實(shí)踐教程-繼承_第2頁
Java基礎(chǔ)實(shí)踐教程-繼承_第3頁
Java基礎(chǔ)實(shí)踐教程-繼承_第4頁
Java基礎(chǔ)實(shí)踐教程-繼承_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

4.1類的繼承機(jī)制4.2

super關(guān)鍵字4.3

方法重寫4.4

final關(guān)鍵字4.5抽象類和接口客觀世界中的事物都是普遍聯(lián)系的。事物之間的聯(lián)系可以劃分為橫向關(guān)聯(lián)和縱向關(guān)聯(lián)。橫向關(guān)聯(lián)是指同一歷史時期的事物之間的聯(lián)系,縱向關(guān)聯(lián)是指不同歷史時期的事物之間的聯(lián)系。在Java編程中,一個類的對象可以作為另外一個類的成員,或者作為其成員方法的形參以及返回值,使得類與類之間形成了橫向關(guān)聯(lián);同時,作為典型的面向?qū)ο缶幊陶Z言,Java語言支持類之間的繼承關(guān)系,這讓類與類之間形成了縱向關(guān)聯(lián)。Java類與類之間縱橫交錯的關(guān)聯(lián)使得編程更加靈活,對客觀事物的描述更加合理科學(xué)。4.1類的繼承機(jī)制在面向?qū)ο蟮木幊讨校^承描述的是類與類之間的關(guān)系,它是面向?qū)ο缶幊套钪匾奶匦浴T贘ava語言中,類的繼承是指在一個現(xiàn)有類的基礎(chǔ)上去構(gòu)建一個新的類,構(gòu)建出來的新類被稱作子類(也叫派生類),現(xiàn)有類被稱作父類(也叫基類),子類會自動擁有父類所有可繼承的屬性和方法。在程序中,如果想聲明一個類繼承另一個類,需要使用extends關(guān)鍵字。Java語言中,類的繼承有以下幾個特點(diǎn):(1)Java類只支持單繼承,不允許多繼承。也就是說一個類最多只能有一個父類,這是Java類繼承與C++類繼承最大的區(qū)別。(2)一個類可以是多個類的父類。(3)Java允許多層繼承,也就是說一個類既可以是某個類的子類,也可以同時是另一個類的父類。父類中只有被protected和public修飾的成員才能夠被子類直接使用,或者父類與子類在同一個包內(nèi),子類對象也可以直接使用由default修飾的父類的成員。4.2super關(guān)鍵字Java類的繼承機(jī)制中,子類并非繼承了父類所有的成員,父類的構(gòu)造方法是不能夠被繼承的。若父類的成員變量是私有的,那么在子類構(gòu)造方法中就不能被訪問。當(dāng)創(chuàng)建子類對象的時候,可以使用子類的構(gòu)造方法來對本類定義的成員變量進(jìn)行初始化,卻不能對繼承而來的成員變量進(jìn)行賦值。這個問題該如何解決呢?這就需要用到Java語言中的super關(guān)鍵字了。Java語言中的super關(guān)鍵字與this關(guān)鍵字有異曲同工之妙,它們都屬于類對象的引用。區(qū)別在于:this關(guān)鍵字表示的是本類對象的引用,而super關(guān)鍵字表示的是父類對象的引用。兩者在使用上也十分相似。在父類成員的訪問權(quán)限允許的條件下,super關(guān)鍵字主要用于以下三個功能:使用super關(guān)鍵字直接調(diào)用父類的構(gòu)造方法來初始化繼承而來的成員變量,這樣就解決了剛才的問題。由于JVM只有在實(shí)例化對象的時候才會自動調(diào)用類的構(gòu)造方法,因此使用super調(diào)用父類的構(gòu)造方法時,也必須寫在子類的構(gòu)造方法中,而且必須遵循以下語法要求:(1)super關(guān)鍵字調(diào)用父類構(gòu)造方法的代碼只能放在子類構(gòu)造方法中的首句。由于super和this關(guān)鍵字調(diào)用構(gòu)造方法時都需要放在構(gòu)造方法的首句,因此一個構(gòu)造方法中不可以同時使用super和this關(guān)鍵字來調(diào)用各自類的構(gòu)造方法,也不可以同時有兩個super關(guān)鍵字調(diào)用父類構(gòu)造方法的代碼。(2)如果子類和父類中均沒有顯式的定義構(gòu)造方法,那么系統(tǒng)會在子類的缺省構(gòu)造方法里面調(diào)用父類的缺省構(gòu)造方法。(3)如果子類中的構(gòu)造方法沒有顯式調(diào)用父類的構(gòu)造方法,那么系統(tǒng)將自動為其調(diào)用父類無參的構(gòu)造方法。(4)如果父類中定義了有參的構(gòu)造方法,且子類構(gòu)造方法中沒有使用this調(diào)用自己的構(gòu)造方法,那么在該構(gòu)造方法中必須直接調(diào)用父類有參的構(gòu)造方法。(5)子類構(gòu)造方法中出現(xiàn)了使用this關(guān)鍵字調(diào)用本類另一個構(gòu)造方法時,不可以再使用super關(guān)鍵字直接調(diào)用父類的構(gòu)造方法,但總能夠通過本類其他的構(gòu)造方法來調(diào)用父類的某個構(gòu)造方法。4.3方法重寫在Java語言中提供了重寫父類方法的機(jī)制,通常稱為方法覆蓋或方法復(fù)寫。此時在子類對象調(diào)用speek方法時,JVM運(yùn)行的是子類中自定義的speek方法。如果還需要調(diào)用從父類繼承而來的speek方法時,使用super關(guān)鍵字在子類方法內(nèi)調(diào)用即可。在Java語言中將第一種實(shí)現(xiàn)方式叫作對象的淺復(fù)制,將第二種實(shí)現(xiàn)方式叫作對象的深復(fù)制。淺復(fù)制使得兩個對象共用一個數(shù)據(jù)空間,而深復(fù)制是兩個對象有各自獨(dú)立的數(shù)據(jù)空間,數(shù)據(jù)空間中的屬性值完全相同。淺復(fù)制后,任意改變其中一個對象的值,另一個對象的值也隨之改變;深復(fù)制后兩個對象的值完全獨(dú)立沒有關(guān)聯(lián)。由此可知,深復(fù)制的代碼安全性會更高,建議采用深復(fù)制的形式。4.4final關(guān)鍵字到Java語言中的常量分為字面常量和字符常量。其中字面常量就是常數(shù),它是具體的一個數(shù)字、字符或者字符串;而字符常量是一個標(biāo)識符,它代表了一個數(shù)值,同時不能夠被改變。其實(shí)字符常量本質(zhì)就是值不能被修改的變量,使用final關(guān)鍵字來修飾,因此也叫作final變量,或稱自定義常量。在Java語言中的final關(guān)鍵字表示“最終的”“不可改變”的意思,它既可以用來修飾基本數(shù)據(jù)類型變量,也可以用來修飾引用數(shù)據(jù)類型變量。此外,final關(guān)鍵字還可以用來修飾成員方法和類。4.4.1final關(guān)鍵字修飾變量變量根據(jù)它的作用域可分為局部變量和類的成員變量。局部變量通常是一個方法內(nèi)臨時定義的變量或方法的形參。final在修飾局部變量和類的成員變量時有些區(qū)別。1.final關(guān)鍵字修飾局部變量當(dāng)final關(guān)鍵字修飾局部變量時,該變量在定義時可以不被初始化,但是使用之前,必須完成初始化且只能初始化一次,后續(xù)在使用的時候不可以再修改它的值。2.final關(guān)鍵字修飾成員變量final關(guān)鍵字在修飾成員變量時,它要在所在類對象創(chuàng)建之前完成初始化,且只能被初始化一次。它的初始化方法有以下三種:(1)直接賦值(2)在構(gòu)造方法中將其初始化(3)在構(gòu)造代碼塊中將其初始化不論通過哪種方式初始化final成員變量,在使用中都不可以再修改它的值。通常,被final修飾的成員變量是所有對象共有的,也就是靜態(tài)成員變量,它的定義方式為:這種成員變量如果被public修飾符修飾,那么它就是全局可見的靜態(tài)常量。全局靜態(tài)常量可以直接使用類名訪問,不可修改,在Java程序中經(jīng)常用到。它可以在創(chuàng)建的時候直接初始化,也可以通過靜態(tài)代碼塊對其進(jìn)行初始化。4.4.2final關(guān)鍵字修飾方法當(dāng)final關(guān)鍵字用來修飾方法時,該方法不允許在派生類中進(jìn)一步被重寫。4.4.3final關(guān)鍵字修飾類當(dāng)final關(guān)鍵字修飾一個類時,則該類會成為最終類,即該類不能被繼承,但是該類可以有父類。final類在官方定義的類庫中出現(xiàn)得比較多,如String類、Integer類等。4.5抽象類和接口4.5.1抽象類在Java編程中,父類的方法經(jīng)常被子類重寫,以實(shí)現(xiàn)更加具體化的功能。有時候不需要創(chuàng)建父類的對象,只是使用子類的對象編寫程序,那么在父類中被重寫的方法只需要給出方法的聲明即可,方法的主體沒有存在的價值。在Java語言中,這種只有聲明、沒有主體的方法被稱為抽象方法。需要注意的是,類的構(gòu)造方法不可以被聲明為抽象方法。當(dāng)一個類中包含了抽象方法時,那么這個類就是抽象類,在類聲明的時候,關(guān)鍵字class之前必須用abstract修飾。抽象類具有以下幾個特點(diǎn):(1)抽象類中可以沒有抽象方法,但有抽象方法的類必須聲明為抽象類;(2)抽象類中可以定義成員變量、成員方法和構(gòu)造方法;(3)可以聲明抽象類的對象,該對象可以被賦值為null,但該對象不可以被實(shí)例化;(4)抽象類可以繼承一個類,抽象類的父類可以是抽象類也可以是非抽象類。通常,抽象類主要用作父類使用,子類通過extends關(guān)鍵字繼承抽象類。抽象類的子類必須實(shí)現(xiàn)父類中的抽象方法,除非該子類也是一個抽象類。4.5.2接口Java語言引入了接口的概念。Java接口是一種抽象類型,是抽象方法和靜態(tài)常量的集合。Java接口除了抽象方法和靜態(tài)常量之外不可以再定義其他類型的成員。Java接口可以聲明一個對象,但不可以對其直接進(jìn)行實(shí)例化,即使該接口中沒有定義抽象方法。一個類只能繼承一個父類,但可以同時實(shí)現(xiàn)多個接口。接口使用Java關(guān)鍵字interface來聲明,其語法格式為:接口里面可以只有靜態(tài)常量或者抽象方法,也可以是空的。接口與類之間存在很多相似之處,主要有以下幾點(diǎn):(1)接口文件和類文件均保存在“.java”為擴(kuò)展名的文件中;(2)接口和類的編譯文件(字節(jié)碼文件)均保存在后綴名為“.class”的文件中;(3)接口和類的編譯文件同樣也必須放在與包名相匹配的目錄結(jié)構(gòu)中;(4)接口和抽象類中均可定義抽象方法及靜態(tài)常量。雖然接口與類有相類似的地方,但是它們屬于不同的概念。類描述對象的屬性和方法,接口則規(guī)定其實(shí)現(xiàn)類要實(shí)現(xiàn)的抽象方法及使用的靜態(tài)常量。表4-5-1描述了接口與抽象類之間的主要區(qū)別。表4-5-1中

溫馨提示

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

評論

0/150

提交評論