




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Java筆記之面向?qū)ο竺嫦驅(qū)ο笫鞘裁矗縧面向?qū)ο笫且环N編程方法l面向?qū)ο笫且环N思維方式l面向?qū)ο蟛皇且环N編程語言為什么要面向?qū)ο螅糠峡陀^規(guī)律首先,找對(duì)象;然后,調(diào)用對(duì)象的方法生活問題< >程序(問題空間) (解空間)面向?qū)ο蟮膬?yōu)勢(shì)重用1、 類的重用2、 繼承/組合復(fù)用性、弱耦合性、可擴(kuò)展性(可插入性)擴(kuò)展后,對(duì)原有系統(tǒng)影響盡量小,組件化變成Java是面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,Java語言提供了定義類、成員變量、方法等最基本的功能。類可被認(rèn)為是一種自定義的數(shù)據(jù)類型,可以使用類來定義變量,所有使用類定義的變量都是引用變量,它們將會(huì)引到到類的對(duì)象。類用于描述客觀世界里某一類對(duì)象的共同特征
2、,而對(duì)象則是類的具體存在,java程序使用類的構(gòu)造器來創(chuàng)建該類的對(duì)象。面向過程是一種以過程為中心的編程思想。面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了。面向?qū)ο?Object Oriented,簡稱OO)是一種以事物為中心的編程思想。面向?qū)ο笫前岩粋€(gè)問題的處理過程按照構(gòu)成問題的事物分解成對(duì)象,建立對(duì)象的目的不是為了完成整個(gè)過程中的一個(gè)步驟,而是為了描述某個(gè)事物在整個(gè)解決問題的過程中的行為。面向?qū)ο蟮某绦蛟O(shè)計(jì)過程中有兩個(gè)重要的概念:類和對(duì)象(對(duì)象也被稱為實(shí)例,instance),其中類是某一批對(duì)象的抽象,可以把類理解成某種概念;對(duì)
3、象才是一個(gè)具體存在的實(shí)體,從這個(gè)意義上,例如日常說的人,其實(shí)都是人的實(shí)例,而不是人類。類和對(duì)象是面向?qū)ο蟮暮诵?。為什么要面向?qū)ο螅?#160;面向?qū)ο笫菫榱私鉀Q系統(tǒng)的可維護(hù)性,可擴(kuò)展性,可重用性,我們?cè)龠M(jìn)一步思考,面向?qū)ο鬄槭裁茨芙鉀Q系統(tǒng)的可維護(hù)性,可擴(kuò)展性,可重用性? 面向?qū)ο螽a(chǎn)生的歷史原因有下面兩點(diǎn): 1、 計(jì)算機(jī)是幫助人們解決問題的,然而計(jì)算機(jī)終究是個(gè)機(jī)器,他只會(huì)按照人所寫的代碼,一步一步的執(zhí)行下去,最終得到了結(jié)果,因此無論程序多么的復(fù)雜,計(jì)算機(jī)總是能輕松應(yīng)付,結(jié)構(gòu)化編程,就是按照計(jì)算機(jī)的思維寫出的代碼,但是人看到這么復(fù)雜的邏輯,就無法維護(hù)和擴(kuò)展了。2、
4、160;結(jié)構(gòu)化設(shè)計(jì)是以功能為目標(biāo)來設(shè)計(jì)構(gòu)造應(yīng)用系統(tǒng),這種做法導(dǎo)致我們?cè)O(shè)計(jì)程序時(shí),不得不將客體所構(gòu)成的現(xiàn)實(shí)世界映射到由功能模塊組成的解空間中,這種轉(zhuǎn)換過程,背離了人們觀察和解決問題的基本思路。 可見結(jié)構(gòu)化設(shè)計(jì)在設(shè)計(jì)系統(tǒng)的時(shí)候,無法解決重用、維護(hù)、擴(kuò)展的問題,而且會(huì)導(dǎo)致邏輯過于復(fù)雜,代碼晦澀難懂。于是人們就想,能不能讓計(jì)算機(jī)直接模擬現(xiàn)實(shí)的環(huán)境,用人類解決問題的思路,習(xí)慣,步驟來設(shè)計(jì)相應(yīng)的應(yīng)用程序?這樣的程序,人們?cè)谧x它的時(shí)候,會(huì)更容易理解,也不需要再把現(xiàn)實(shí)世界和程序世界之間來回做轉(zhuǎn)換。
5、0;與此同時(shí),人們發(fā)現(xiàn),在現(xiàn)實(shí)世界中存在的客體是問題域中的主角,所謂客體是指客觀存在的對(duì)象實(shí)體和主觀抽象的概念,這種客體具有屬性和行為,而客體是穩(wěn)定的,行為不穩(wěn)定的,同時(shí)客體之間具有各種聯(lián)系,因此面向客體編程,比面向行為編程,系統(tǒng)會(huì)更穩(wěn)定,在面對(duì)頻繁的需求更改時(shí),改變的往往是行為,而客體一般不需要改變,所以我們就把行為封裝起來,這樣改變時(shí)候只需要改變行為即可,主架構(gòu)則保持了穩(wěn)定。 于是面向?qū)ο缶彤a(chǎn)生了。 然而人們追求的系統(tǒng)可維護(hù)性,可擴(kuò)展性,可重用性又是怎么在面向?qū)ο笾畜w現(xiàn)出來的呢? 首先看看面向?qū)ο蟮娜筇卣鳎?#160;封裝:找到變化并且把它封裝起來,你就可以
6、在不影響其它部分的情況下修改或擴(kuò)展被封裝的變化部分,這是所有設(shè)計(jì)模式的基礎(chǔ),就是封裝變化,因此封裝的作用,就解決了程序的可擴(kuò)展性。 繼承:子類繼承父類,可以繼承父類的方法及屬性,實(shí)現(xiàn)了多態(tài)以及代碼的重用,因此也解決了系統(tǒng)的重用性和擴(kuò)展性,但是繼承破壞了封裝,因?yàn)樗菍?duì)子類開放的,修改父類會(huì)導(dǎo)致所有子類的改變,因此繼承一定程度上又破壞了系統(tǒng)的可擴(kuò)展性,所以繼承需要慎用,只有明確的IS-A關(guān)系才能使用,同時(shí)繼承在在程序開發(fā)過程中重構(gòu)得到的,而不是程序設(shè)計(jì)之初就使用繼承,很多面向?qū)ο箝_發(fā)者濫用繼承,結(jié)果造成后期的代碼解決不了需求的變化了。因此優(yōu)先使用組合,而不是繼承,是面向?qū)ο箝_發(fā)中一個(gè)重
7、要的經(jīng)驗(yàn)。 多態(tài):接口的多種不同的實(shí)現(xiàn)方式即為多態(tài)。接口是對(duì)行為的抽象,剛才在封裝提到,找到變化部分并封裝起來,但是封裝起來后,怎么適應(yīng)接下來的變化?這正是接口的作用,接口的主要目的是為不相關(guān)的類提供通用的處理服務(wù),我們可以想象一下。比如鳥會(huì)飛,但是超人也會(huì)飛,通過飛這個(gè)接口,我們可以讓鳥和超人,都實(shí)現(xiàn)這個(gè)接口,這就實(shí)現(xiàn)了系統(tǒng)的可維護(hù)性,可擴(kuò)展性。 因此面向?qū)ο竽軐?shí)現(xiàn)人們追求的系統(tǒng)可維護(hù)性,可擴(kuò)展性,可重用性。面向?qū)ο笫且环N編程思想,起初,“面向?qū)ο蟆笔菍V冈诔绦蛟O(shè)計(jì)中采用封裝、繼承、多態(tài)等設(shè)計(jì)方法,但面向?qū)ο蟮乃枷胍呀?jīng)涉及到
8、軟件開發(fā)的各個(gè)方面,比如現(xiàn)在細(xì)分為了面向?qū)ο蟮姆治?OOA),面向?qū)ο蟮脑O(shè)計(jì)(OOD),面向?qū)ο蟮木幊虒?shí)現(xiàn)(OOP) 面對(duì)對(duì)象使用在什么地方?在編程中我們使用對(duì)象來模擬現(xiàn)實(shí)中的對(duì)象,用屬性模擬特征,方法模擬能力。每次使用都會(huì)創(chuàng)建對(duì)象,定義屬性,方法。這樣比較麻煩,為了代碼重用性,我們定義類,類是創(chuàng)建對(duì)象的模板,里面定義了對(duì)象應(yīng)該具備的屬性和方法。使我們不用每次創(chuàng)建對(duì)象時(shí)都重復(fù)的定義,直接使用即可。 綜上,類是對(duì)象的抽象模板,定義了對(duì)象將具備的屬性能力,在創(chuàng)建對(duì)象及使用對(duì)象時(shí)達(dá)到代碼重用的功能。 類是什么?類是面向?qū)ο蟮闹匾獌?nèi)容,可以把類當(dāng)做一種自定義類型,可以使用類來定義變量,這種類
9、型的變量統(tǒng)稱為引用變量。也就是說,類是引用類型。類名的取名:要是一個(gè)合法的標(biāo)識(shí)符,滿足Java的語法要求;類名必須是有一個(gè)或者多個(gè)有意義的單詞連綴而成的,每個(gè)單詞首字母大寫,其他字母全部小寫,單詞與單詞直接不要任何分隔符。類的使用:修飾符 class 類名零到多個(gè)構(gòu)造器定義. 零到多個(gè)成員變量. 零到多個(gè)方法.構(gòu)造器用于構(gòu)造該類的實(shí)例(對(duì)象),Java通過new關(guān)鍵字來調(diào)用構(gòu)造器,從而返回該類的實(shí)例(對(duì)象)。成員變量用于定義該類或該類的實(shí)例所包含的狀態(tài)數(shù)據(jù)。方法用于定義該類或該類的對(duì)象的行為特征或者功能實(shí)現(xiàn)。構(gòu)造器是什么?構(gòu)造器是一個(gè)類創(chuàng)建對(duì)象的根本途徑,如果一個(gè)類沒有構(gòu)造器,這個(gè)類統(tǒng)稱無法創(chuàng)
10、建實(shí)例。如果程序員沒有為一個(gè)類編寫構(gòu)造器,這個(gè)類通常無法創(chuàng)建對(duì)象(實(shí)例),則系統(tǒng)會(huì)為該類提供一個(gè)默認(rèn)的構(gòu)造器。*注意:構(gòu)造器、構(gòu)造方法以及構(gòu)造函數(shù)都是指構(gòu)造方法。構(gòu)造器的使用格式:修飾符 構(gòu)造器名(形參列表)由零條到多條可執(zhí)行性語句組成的構(gòu)造器執(zhí)行體修飾符可以省略,也可以是public、protected、private之一構(gòu)造器名必須和類名相同。形參列表和定義方法形參列表的格式完全相同。*注意:構(gòu)造器不能定義返回值類型,也不能使用void聲明構(gòu)造器沒有返回值,如果使用則構(gòu)造器不再是構(gòu)造器而是被系統(tǒng)當(dāng)做普通方法。* 構(gòu)造方法與普通方法的區(qū)別 1、語法上不同 構(gòu)造方法沒有返回值類型 普通方法一定
11、有返回值類型(void) 方法名和類名一樣-構(gòu)造方法 2.作用不同 構(gòu)造方法是初始化對(duì)象時(shí)調(diào)用的 普通方法需要時(shí)調(diào)用 3.構(gòu)造方法不能被final static abstract syschronized修飾 成員變量是什么?成員變量是類具有的一些基本屬性。成員變量又稱為成員屬性,全局變量,它是描述對(duì)象狀態(tài)的數(shù)據(jù),是類中很重要的組成成分。成員變量的格式:修飾符 類型 成員變量名 =默認(rèn)值;修飾符可以省略,也可以是public、protected、private、static、final等,public、protected、private只能出現(xiàn)其一,可與static、final組合修飾。類型可
12、以是基本數(shù)據(jù)類型和引用數(shù)據(jù)類型成員變量名符合java命名規(guī)范。默認(rèn)值可以指定默認(rèn)值。局部變量與成員變量(全局變量)區(qū)別:1作用范圍:局部變量定義它的當(dāng)前這個(gè)方法里;全局變量在整個(gè)類里2局部變量和局部變量不能同名,全局變量和全局變量不能同名, 但是全局變量和局部變量可以同名3局部變量和全局變量同名的話,局部變量有優(yōu)先級(jí);4全局變量有默認(rèn)初始值,局部變量沒有,所以局部變量聲明的時(shí)候一般要給初始值;5用this區(qū)分同名的局部變量和全局變量(同名的話全局變量用this.變量名表示)6 局部變量在方法調(diào)用完后釋放內(nèi)存,成員變量在類和對(duì)象不使用的時(shí)候釋放內(nèi)存7 成員變量 堆存中 局部變量 常量池中成員方法
13、是什么?成員方法描述對(duì)象所具有的功能或操作,反映對(duì)象的行為,是具有某種相對(duì)獨(dú)立功能的程序模塊。一個(gè)類或?qū)ο罂梢杂卸鄠€(gè)成員方法,對(duì)象通過執(zhí)行它的成員方法對(duì)傳來的消息作出響應(yīng),完成特定的功能。成員方法一旦定義,便可在不同的程序段中多次調(diào)用,故可增強(qiáng)程序結(jié)構(gòu)的清晰度,提高編程效率。成員方法的分類,從成員方法的來源看,可將成員方法分為:類庫成員方法。這是由 Java 類庫提供的,用戶只要按照 Java 提供的調(diào)用格式去使用這些成員方法即可。用戶自定義的成員方法。這是為了解決用戶的特定問題,由用戶自己編寫的成員方法。程序設(shè)計(jì)的主要工作就是編寫用戶自定義類、自定義成員方法。從成員方法的形式看,可將成員方法
14、分為:無參數(shù)成員方法和帶參數(shù)成員方法。成員方法的語法格式:修飾符 返回值的類型 成員方法名(形式參數(shù)表) throw 異常表 由零條到多條可執(zhí)行性語句組成的方法體成員方法的聲明包括成員方法頭和成員方法體兩部分。成員方法頭確定成員方法的名字、形式參數(shù)的名字和類型、返回值的類型、訪問限制和異常處理等;成員方法體由包括在花括號(hào)內(nèi)的說明部分和執(zhí)行語句部分組成,它描述該方法功能的實(shí)現(xiàn)。修飾符:可以是公共訪問控制符 public、私有訪問控制符 private、保護(hù)訪問控制符 protected 等訪問權(quán)限修飾符,也可以是靜態(tài)成員方法修飾符 static、最終成員方法修飾符 final、本地成員方法修飾符
15、 native、抽象成員方法修飾符 abstract等非訪問權(quán)限修飾符。訪問權(quán)限修飾符指出滿足什么條件時(shí)該成員方法可以被訪問。非訪問權(quán)限修飾符指明數(shù)據(jù)成員的使用方式。返回值類型:運(yùn)行任何數(shù)據(jù)類型,包括基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。如果聲明了方法返回值類型,則方法體必須有一個(gè)有效的return語句,該語句返回一個(gè)變量或一個(gè)表達(dá)式,這個(gè)變量或者表達(dá)式的類型必須與此處聲明的類型匹配。如果一個(gè)方法沒有返回值,必須使用void來聲明沒有返回值。形參列表:形參列表用于定義該方法可以接受的參數(shù),參數(shù)列表由零組到多組“參數(shù)類型 形參名”組成,多組參數(shù)之間以英文逗號(hào)隔開,形參類型和形參名之間以英文空格隔開。一旦在
16、定義方法時(shí)指定了形參列表,則調(diào)用該方法時(shí)必須傳入對(duì)應(yīng)的參數(shù)值誰調(diào)用方法,誰負(fù)責(zé)為形參賦值。*注意:方法體里多條可執(zhí)行語句之間有嚴(yán)格的執(zhí)行順序,排在方法體前面的語句總是先執(zhí)行,排在方法體后的語句總是后執(zhí)行。方法的重載前提:在同一類中條件:同名不同參(方法名相同,參數(shù)列表不同)參數(shù)列表不同情況:數(shù)據(jù)類型不同,數(shù)據(jù)數(shù)量不同,類型和數(shù)量都不同*注意:與參數(shù)名無關(guān)(重載時(shí)不能只更改參數(shù)列表的數(shù)據(jù)名,而其它都一樣)靜態(tài) static 成員變量和成員方法、代碼塊靜態(tài)變量與實(shí)例變量的區(qū)別:1 語法上的區(qū)別靜態(tài)變量-static 修飾實(shí)例變量沒有2內(nèi)存靜態(tài)變量-只有一個(gè)拷貝,所有對(duì)象共享,在類加載的時(shí)候jvm就
17、為靜態(tài)數(shù)據(jù)分配內(nèi)存實(shí)例變量-可以多個(gè)拷貝,每個(gè)對(duì)象的實(shí)例變量互不影響靜態(tài)方法里只能訪問靜態(tài)的變量、常量或方法,不能訪問非靜態(tài)的數(shù)據(jù)和方法普通方法里能訪問靜態(tài)的數(shù)據(jù)或方法3 使用區(qū)別靜態(tài)變量-通過類名調(diào)用實(shí)例變量-通過對(duì)象名調(diào)用靜態(tài)代碼塊不能寫在任何方法里靜態(tài)代碼塊只確定優(yōu)先級(jí),多個(gè)靜態(tài)代碼塊按照出現(xiàn)的順序執(zhí)行;代碼塊的優(yōu)先級(jí):(靜態(tài)代碼塊執(zhí)行順序永遠(yuǎn)在最前面)靜態(tài)代碼塊構(gòu)造代碼塊構(gòu)造方法(普通方法、普通代碼塊)靜態(tài)代碼塊、構(gòu)造方法、構(gòu)造代碼塊、普通方法、普通代碼塊、靜態(tài)方法的運(yùn)行順序;靜態(tài)方法:能被繼承,不能被重寫(靜態(tài)的方法在類加載的時(shí)候就加載了,在整個(gè)運(yùn)行過程中是保持不變的,所以不能被重寫
18、)即使在子類里有個(gè)同名同參的靜態(tài)方法,也不算被重寫不能被重寫的方法:構(gòu)造方法 static、 private、 final修飾的方法 對(duì)象是什么?對(duì)象是類中的存在的實(shí)體。對(duì)象的創(chuàng)建:例:首先創(chuàng)建了Person類,定義了name和age成員變量和say方法;然后使用Peron類定義一個(gè)Person類型的變量Person p;通過new關(guān)鍵字調(diào)用Person類的構(gòu)造器,返回一個(gè)Person實(shí)例,將Person實(shí)例賦給p變量。P=new Person;可以簡寫成:Person p=new Person();類里定義的方法和成員變量都可以通過類或?qū)ο髞碚{(diào)用。類或?qū)ο笤L問方法或成員變量的語法是:類.類變
19、量|方法,或者對(duì)象.實(shí)例變量|方法例:=”李斯”; p.say(“好久不見”);面向?qū)ο笥兴拇筇攸c(diǎn):封裝、繼承、多態(tài)、抽象什么是封裝?封裝是只將對(duì)象狀態(tài)信息隱藏在對(duì)象內(nèi)部,不允許外部程序直接訪問對(duì)象內(nèi)部信息,而是通過該類所提供的方法來實(shí)現(xiàn)對(duì)內(nèi)部信息的操作和訪問。為什么要封裝?很多時(shí)候?qū)ο髮傩缘馁x值是有一定限制的,如:Hero的level(等級(jí))一定是大于零的,若有“滿級(jí)”設(shè)定則不可以大于最大等級(jí)值。因此需要將屬性值私有化隱藏,使其不能在類外部隨意修改,再通過定義公共方法來訪問私有屬性。封裝由訪問控制符來實(shí)現(xiàn)。訪問控制級(jí)別表 private default protected pub
20、lic同一個(gè)類中 同一個(gè)包中 子類中 全局范圍內(nèi) 對(duì)一個(gè)類或?qū)ο髮?shí)現(xiàn)良好的封裝,可實(shí)現(xiàn)以下目的:1、 隱藏類的實(shí)現(xiàn)細(xì)節(jié)。2、 讓使用者只能通過事先預(yù)定的方法來訪問數(shù)據(jù),從而可以在該方法里加入控制邏輯,限制對(duì)成員變量的不合理訪問。3、 可進(jìn)行數(shù)據(jù)檢查,從而有利于保證對(duì)象信息的完整性。4、 便于修改,提高代碼的可維護(hù)性為了實(shí)現(xiàn)良好的封裝,需要從兩方面考慮:1、將對(duì)象的成員變量和實(shí)現(xiàn)細(xì)節(jié)隱藏起來,不允許外部直接訪問。2、把方法暴露出來,讓方法控制對(duì)這些成員變量進(jìn)行安全的訪問和操作。什么是繼承?繼承是面向?qū)ο蟮娜筇匦灾弧K鞘褂靡汛嬖诘念惖亩x作為基礎(chǔ)建立新類的技術(shù)。新類的定義可以增加新的數(shù)據(jù)或新
21、的功能,也可以用父類的功能,但不能選擇性地繼承父類。Java的繼承具有單繼承的特點(diǎn),每個(gè)子類只有一個(gè)直接父類,可以有無限多個(gè)間接父類。為什么要繼承?因?yàn)槔^承較好地解決了代碼重用問題,有效的減少了重復(fù)代碼。如何繼承?語法格式:修飾符 class SubClass extends SuperClass/類定義的部分繼承的特點(diǎn):1、子類繼承的是父類非私有的成員屬性和方法2、子類可以重寫父類的屬性和方法,調(diào)用的是子類重寫后的屬性和方法 重寫父類的方法,訪問權(quán)限權(quán)限修飾符大于等于父類得到方法的訪問權(quán)限修飾符3、子類可以有自己的屬性和方法 方法的重寫:繼承,同名同參(包括返回值類型也一樣) 方法的重載:同
22、一個(gè)類,同名不同參4、繼承關(guān)系中的構(gòu)造方法 如果父子類沒有自定義的構(gòu)造方法:創(chuàng)建子類對(duì)象的時(shí)候先調(diào)用父類的構(gòu)造方法(子類 構(gòu)造方法可以任意弄)如果父類自定義了構(gòu)造方法(無參):(子類構(gòu)造方法可以任意弄)如果父類自定義了有參數(shù)的構(gòu)造方法:子類的構(gòu)造方法里一定要添加(調(diào)用)這個(gè)有參的構(gòu)造方法,一定要添加相同的參數(shù)列表的構(gòu)造方法 5、Object為特殊超類或基類,所以的類都直接或間接的繼承Obj; 6、java只支持單繼承 * 重點(diǎn)是: * 1、 父類自定義了有參的構(gòu)造方法時(shí),沒有了無參的構(gòu)造方法時(shí),子類已寫構(gòu)造方法的情況下,子類的構(gòu)造方法里一定要調(diào)用父類的有參的構(gòu)造方法 * 2、父類自定義了有參的
23、構(gòu)造方法時(shí),子類繼承父類,一定要添加相同的參數(shù)列表的構(gòu)造方法重寫:重寫(Override)也稱方法覆蓋,要遵循“兩同兩小一大”規(guī)則,“兩同”即方法名相同、形參列表相同;兩小,子類方法返回值類型應(yīng)比父類方法返回值類型更小或者相等,子類方法聲明拋出的異常類應(yīng)比父類方法聲明拋出的異常類更小或相等;一大,子類方法的訪問權(quán)限應(yīng)比父類的訪問權(quán)限更大或相等。super表示當(dāng)前活動(dòng)對(duì)象的直接父類對(duì)象。使用格式:super.成員變量名;super.成員方法名;super(參數(shù)); /父類的構(gòu)造方法注意:靜態(tài)方法中不能使用this 和super 。什么是多態(tài)?多態(tài)是指面向?qū)ο蟪绦蜻\(yùn)行時(shí),相同的信息可能會(huì)送給多個(gè)不
24、同的類型之對(duì)象,而系統(tǒng)可依據(jù)對(duì)象所屬類型,引發(fā)對(duì)應(yīng)類型的方法,而有不同的行為。為什么會(huì)出現(xiàn)多態(tài)?Java引用變量有兩個(gè)類型:編譯時(shí)類型和運(yùn)行時(shí)類型。編譯時(shí)類型由聲明該變量時(shí)使用的類型決定,運(yùn)行時(shí)類型由實(shí)際賦給該變量的對(duì)象決定。當(dāng)它們出現(xiàn)不一致時(shí),就可能出現(xiàn)所謂的多態(tài)了。多態(tài)體現(xiàn)在繼承過程中也就是說子類和父類的相互類型轉(zhuǎn)換。 子類轉(zhuǎn)換為父類稱為向上轉(zhuǎn)型,在創(chuàng)建對(duì)象時(shí),對(duì)象既可以作為其本身的類進(jìn)行引用也可以作為其父類型進(jìn)行引用。也就是說 將一個(gè)子類對(duì)象直接賦值給一個(gè)父類的引用變量 ,這種我們稱為向上轉(zhuǎn)型。 父類轉(zhuǎn)換成子類,與向上類型相對(duì)應(yīng)的這個(gè)父類對(duì)象作為其子類類型的引用時(shí),這時(shí)候我們就說父類轉(zhuǎn)換
25、成子類了。父類轉(zhuǎn)換成子類需要強(qiáng)制類型轉(zhuǎn)換。子轉(zhuǎn)父向上轉(zhuǎn)換自動(dòng)類型轉(zhuǎn)換 父類型 對(duì)象名=new 子類型();方法: 執(zhí)行子類重寫父類的方法,子類繼承父類的方法 無法調(diào)用子類特有的方法父轉(zhuǎn)子向下轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換 子類型 對(duì)象名=(子類型)new 父類型(); 方法: 執(zhí)行子類繼承或重寫父類的方法 可以調(diào)用子類特有的方法兩種表現(xiàn)形式:1、 自動(dòng)類型轉(zhuǎn)換-向上轉(zhuǎn)型(子類轉(zhuǎn)成父類) 編譯時(shí)類型:父類型 運(yùn)行時(shí)類型:子類型父類型 對(duì)象名=new 子類型 ();調(diào)用方法:調(diào)用子類重寫父類的方法,子類繼承父類的方法,無法調(diào)用子類特有的方法1、 強(qiáng)制類型轉(zhuǎn)換-向下轉(zhuǎn)型(父類轉(zhuǎn)子類) 編譯時(shí)類型:子類型 運(yùn)行時(shí)類
26、型:父類型子類型 對(duì)象名=(子類型)new 父類型();出現(xiàn)異常:java.langClassCastException解決:對(duì)象名 instanceof 類型 判斷該對(duì)象是不是這個(gè)類型的實(shí)例如果是的話,返回true->進(jìn)行強(qiáng)制類型轉(zhuǎn)換如果不是的話,返回falseFinal關(guān)鍵字:(最終目的是不發(fā)生改變)修飾成員變量:不能被修改,必須賦初值修飾方法:可以被子類繼承,可以重載 ,但是不能被重寫修飾類:不能被繼承什么是抽象?使用了關(guān)鍵詞abstract聲明的類叫作“抽象類”。如果一個(gè)類里包含了一個(gè)或多個(gè)抽象方法,類就必須指定成abstract(抽象)?!俺橄蠓椒ā?屬于一種不完整的方法,只含
27、有一個(gè)聲明,沒有方法主體?!俺橄蠓椒ā?屬于一種不完整的方法。抽象方法的語法格式:在普通方法上加個(gè)absract用abstract關(guān)鍵字來修飾一個(gè)方法時(shí),該方法叫做抽象方法。抽象方法不能有實(shí)現(xiàn)的方法體,它必須被重寫,定義了抽象方法的類必須是抽象類。抽象類的作用?1、在面向?qū)ο蠓椒ㄖ?,抽象類主要用來進(jìn)行類型隱藏。構(gòu)造出一個(gè)固定的一組行為的抽象描述,但是這組行為卻能夠有任意個(gè)可能的具體實(shí)現(xiàn)方式。這個(gè)抽象描述就是抽象類,而這一組任意個(gè)可能的具體實(shí)現(xiàn)則表現(xiàn)為所有可能的派生類。模塊可以操作一個(gè)抽象體。由于模塊依賴于一個(gè)固定的抽象體,因此它可以是不允許修改的;2、通過從這個(gè)抽象體派生,也可擴(kuò)展此模塊的行為
28、功能。為了能夠?qū)崿F(xiàn)面向?qū)ο笤O(shè)計(jì)的一個(gè)最核心的原則OCP(Open-Closed Principle),抽象類是其中的關(guān)鍵所在。3、抽象類往往用來表征對(duì)問題領(lǐng)域進(jìn)行分析、設(shè)計(jì)中得出的抽象概念,是對(duì)一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。抽象類和抽象方法的定義格式:abstract class CombatUnitpublic abstract void talk();-與普通方法一樣有參數(shù)列表,沒有方法體直接用語句結(jié)束標(biāo)識(shí)。/抽象類中也可以定義非抽象方法抽象類:1、用abstract修飾2、不能實(shí)例化,通過非抽象的子類來實(shí)例化3、抽象類里面可以有普通的方法,不一定有抽象方法4、如果一個(gè)
29、類里有抽象方法,這個(gè)類一定是抽象方法5、抽象方法格式:訪問修飾符 abstract 返回值類型 方法名(參數(shù)列表);抽象類和普通類的區(qū)別:1、 語法上的不同:有沒有abstract修飾2、 普通類里一定沒有抽象方法,抽象類里不一定有抽象方法 有抽象方法的一定是抽象類3、 抽象類不能直接被實(shí)例化,普通類可以4、 抽象類必須被繼承,繼承抽象類的子類必須添加抽象類里所有的抽象方,如果沒有添加全部的抽象方法,那么這個(gè)子類也是抽象類。5、 普通類里有的,抽象類都可以用抽象方法和普通方法的區(qū)別:1、 抽象方法沒有方法體,以及被abstract修飾2、 抽象方法必須被重寫3、 都可以被重寫重載可以修飾抽象方
30、法的修飾符可以有哪些,哪些不行?理由不行 :Private,F(xiàn)inal,StaticDefault(不同包下繼承他的子類無法重寫這個(gè)方法)為什么不直接扔掉抽象方法?想象一下,當(dāng)定義一個(gè)CombatUnit(戰(zhàn)斗單位)的引用,但實(shí)際上引用到的是其子類實(shí)例,而其子類都有talk方法,但talk方法的實(shí)現(xiàn)不同。當(dāng)我們想通過這個(gè)CombatUnit引用來調(diào)用talk方法,那么必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換為其子類,才能調(diào)用talk方法,但這就降低了程序的靈活性。什么是接口?抽象類是從多個(gè)類中抽象出來的模板,如果將這種抽象進(jìn)行得更徹底,則可以提煉出一種更加特殊的抽象類接口(interface),接口里不能包含普通
31、方法,接口里的所有方法都是抽象方法。只具有抽象方法的抽象類叫做接口。接口的特點(diǎn):1.接口不能被繼承(extends),只能被實(shí)現(xiàn)(implements);2.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口;3.實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)接口中的所有方法。否則為抽象類。4.在類中實(shí)現(xiàn)接口中定義的方法時(shí),不能比接口中定義的方法有更低的訪問權(quán)限。因此,被實(shí)現(xiàn)的接口方法必須用public修飾。接口的定義格式訪問修飾符 interface 接口名 常量(并且必須初始化 ); 成員方法定義(只有原形而無函數(shù)定義體 );接口也可像定義類一樣實(shí)現(xiàn)繼承,但接口只能繼承接口,不能繼承任何類。接口是多繼承的。訪問修飾符 interface 接口
32、名 extends 父接口1,父接口2 常量(并且必須初始化 ); 成員方法定義(只有原形而無函數(shù)定義體 );接口的實(shí)現(xiàn)修飾符 class 類名 extends 父類名 implements 接口1, 接口2/實(shí)現(xiàn)接口的方法 接口是可以被“多實(shí)現(xiàn)”的,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口; 接口的實(shí)現(xiàn)不影響類的繼承,接口的實(shí)現(xiàn)使用implements關(guān)鍵字; 接口 之間 的繼承使用extends,而不是implements。接口-接口 多繼承接口-類 多實(shí)現(xiàn)類-類 單繼承抽象類類名 對(duì)象名 =new 非抽象子類();抽象類的實(shí)例化接口名 引用變量名 =new 非抽象的實(shí)現(xiàn)類();接口的實(shí)例化抽象類和接口的區(qū)別:相同點(diǎn):1、都不能直接實(shí)例化,抽象類必須被繼承,通過非抽象子類來實(shí)例化,接口必須被實(shí)現(xiàn),通過非抽象的實(shí)現(xiàn)類來實(shí)例化2、都是多態(tài)具體的表現(xiàn)形式不同點(diǎn):1、抽象類是被繼承,單繼承 接口只能被實(shí)現(xiàn),多實(shí)現(xiàn)2、抽象類:可以具有普通方法 接口:只能有抽象方法3、抽象類:成員變量可以有變量 接口:只能是常量public final static4、抽象類:抽象方法的訪問權(quán)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 叉車臺(tái)班合同范本
- 音樂課程合同范本
- 清運(yùn)泥土合同范本
- 口腔護(hù)士合同范本簡易
- 醫(yī)院工傷協(xié)作合同范本
- 臺(tái)球俱樂部合同范本
- 兄弟合作合同范本
- 合同9人合作合同范本
- 買本田新車合同范本
- 產(chǎn)地供應(yīng)合同范本
- 《東北財(cái)經(jīng)大學(xué)審計(jì)》課件
- 牧童謠課件教學(xué)
- 大學(xué)物理實(shí)驗(yàn)(緒論)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 圖書出版項(xiàng)目合作協(xié)議
- 《現(xiàn)代家政導(dǎo)論》電子教案 2.2模塊二項(xiàng)目二家庭制度認(rèn)知
- 商務(wù)禮儀課件教學(xué)課件
- 部編版七年級(jí)歷史下冊(cè)全冊(cè)導(dǎo)學(xué)案
- 酒店住宿投標(biāo)方案(技術(shù)標(biāo))
- 2024風(fēng)力發(fā)電葉片維保作業(yè)技術(shù)規(guī)范
- 中建分供方資源管理辦法
- (人教PEP2024版)英語一年級(jí)上冊(cè)Unit 3 教學(xué)課件(新教材)
評(píng)論
0/150
提交評(píng)論