Java程序設(shè)計PPT課件版 第三章面向?qū)ο笏枷隷第1頁
Java程序設(shè)計PPT課件版 第三章面向?qū)ο笏枷隷第2頁
Java程序設(shè)計PPT課件版 第三章面向?qū)ο笏枷隷第3頁
Java程序設(shè)計PPT課件版 第三章面向?qū)ο笏枷隷第4頁
Java程序設(shè)計PPT課件版 第三章面向?qū)ο笏枷隷第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第三章Java面向?qū)ο笏枷胧谡n教師:高成珍QQ:1281147324面向?qū)ο笏枷牒突靖拍畎膭?chuàng)建和使用方法的定義和參數(shù)傳遞類的定義和使用對象的創(chuàng)建和使用本章主要內(nèi)容熟悉包的創(chuàng)建和使用熟悉方法的參數(shù)傳遞

熟悉對象的創(chuàng)建與使用

掌握類的定義和使用本章重點(diǎn)與難點(diǎn)掌握面向?qū)ο蟮幕舅枷朊嫦驅(qū)ο蠡舅枷朊嫦驅(qū)ο笳Z言的五個基本特性:萬物皆對象;程序是對象的集合,它們通過發(fā)送消息來告知彼此所要做的;每個對象都有自己的由其他對象所構(gòu)成的存儲;(通過創(chuàng)建現(xiàn)有對象的包的方式創(chuàng)建新類型的對象)每個對象都擁有其類型,即每個對象都是某個類的一個示例;某一特定類型的所有對象都可以接收同樣的消息類和對象Java語言是純粹的面向?qū)ο蟮某绦蛟O(shè)計語言,對象和類是面向?qū)ο蟮暮诵摹?/p>

對象是真實(shí)世界中的物體在人腦中的映像,包括實(shí)體對象和邏輯對象。實(shí)體對象指的是我們在現(xiàn)實(shí)生活中能看得見、摸得著,實(shí)際存在的東西。比如人,桌子等。邏輯對象是針對非具體物體,但是在邏輯上存在的東西的反映。比如人和人之間的關(guān)系、時間等。對象存在兩種特征:行為和狀態(tài)。對象是一組數(shù)據(jù)和相關(guān)方法的集合。程序中可通過變量向其傳遞或獲取數(shù)據(jù),而通過調(diào)用其中的方法執(zhí)行某些操作。在Java中,對象必須基于類來創(chuàng)建。類和對象

類是用來描述一組具有共同狀態(tài)和行為的對象的原型,是對這組對象的概括、歸納與抽象表達(dá)。在面向?qū)ο蟪绦蛟O(shè)計中,可以讓具有共同特征的對象形成類,它定義了同類對象共有的變量和方法。通過類可以生成具有特定狀態(tài)和行為的實(shí)例,這便是對象。從某種程度上講,Java編程就是設(shè)計類,在編程中可以采用自定義方法或繼承方法設(shè)計一個類。此外,還可在編程時利用類來創(chuàng)建對象,然后改變對象變量值和調(diào)用對象方法來實(shí)現(xiàn)程序的某些功能。類和對象的區(qū)別大部分時候,定義一個類就是為了重復(fù)創(chuàng)建該類的實(shí)例,同一個類的多個實(shí)例具有相同的特征,而類則是定義了多個實(shí)例的共同特征。類不是一種具體存在,實(shí)例才是具體存在。類是一個抽象的概念,對象是一個具體的概念。類是在一組對象的基礎(chǔ)上,通過抽象和概括獲得的一個概念。對象是由數(shù)據(jù)和方法緊密結(jié)合的一個封裝體,具有信息隱藏的能力。對象可以通過方法與其它對象進(jìn)行通信,但并不知道這些方法的實(shí)現(xiàn)細(xì)節(jié)封裝封裝是指將代碼及其處理的數(shù)據(jù)綁定在一起的一種編程機(jī)制,保證程序和數(shù)據(jù)都不受外部干擾。

封裝的目的在于使對象的設(shè)計者和使用者分開,使用者不必知道對象行為實(shí)現(xiàn)的細(xì)節(jié),只需要使用設(shè)計者提供的接口來訪問對象。封裝帶來的兩個好處:模塊化和數(shù)據(jù)隱藏。模塊化意味著對象代碼的編寫和維護(hù)可以獨(dú)立進(jìn)行,不會影響到其他模塊,而且有很好的重用性;數(shù)據(jù)隱藏則使對象有能力保護(hù)自己,它可以自行維護(hù)自身的數(shù)據(jù)和方法。因此,封裝機(jī)制可提高程序的安全性和可維護(hù)性。

繼承繼承是指兩個類之間的一種關(guān)系,指一個類可以繼承另一個類的狀態(tài)和行為。被繼承的類稱為超類或父類,繼承父類的類稱為子類。一個父類可以同時擁有多個子類,這時這個父類實(shí)際上是所有子類的公共變量和方法的集合。子類除了具有從父類繼承而來的變量和方法外,還可增加自己的變量和方法。子類也可以改變從父類繼承來的方法,即可以覆蓋繼承的方法。繼承使父類的代碼得到重用,在繼承父類提供的共同特性的基礎(chǔ)上增加新的代碼,從而使編程不必一切從頭開始,有效提高了編程效率。多態(tài)多態(tài)性可以用“一個對外接口,多個內(nèi)在實(shí)現(xiàn)方法”來表示。可以在一個類中定義多個同名方法,程序在調(diào)用某個方法時,系統(tǒng)會自動根據(jù)參數(shù)類型和個數(shù)的不同調(diào)用不同的方法,這種機(jī)制被稱為方法重載。此外,當(dāng)利用繼承由父類創(chuàng)建子類時,如果父類中的某些方法不適合子類,我們無法刪除它們,但可以重新定義它們,這被稱為覆蓋。如此一來,當(dāng)我們利用子類創(chuàng)建對象時,如果調(diào)用對象的某個方法,系統(tǒng)會首先在子類中查找此方法。如果找到,則調(diào)用子類的方法;否則,將向上查找,即在父類中查找此方法。類的定義Java語言里定義類的簡單語法如下:[修飾符]class類名[extends

類名]

[implements

接口1,接口2…]{

零到多個構(gòu)造器定義..

零到多個屬性…

零到多個方法…}類的定義修飾符可以是public、final、abstract,或者完全省略這三個修飾符,類名只要是一個合法的標(biāo)識符即可。public是訪問修飾符,final說明該類不能被繼承,是最終類例如Math類,abstract則說明該類是抽象類。對一個類定義而言,可以包含三鐘最常見的成員:構(gòu)造器、屬性和方法,三種成員都可以定義零個或多個,如果三種成員都只定義零個,就是定義一個空類,這沒有太大的實(shí)際意義。類的定義extends關(guān)鍵字用來告訴編譯器創(chuàng)建的類是從父類繼承來的子類,父類必須是Java系統(tǒng)的預(yù)定義類或用戶已經(jīng)定義好的類。一個類只能有一個父類,但一個父類可以有多個子類。implements關(guān)鍵字用來告訴編譯器類實(shí)現(xiàn)的接口,一個類可以實(shí)現(xiàn)多個接口,多個接口之間用逗號分隔。使用接口的主要目的是為了使程序的功能描述和功能的具體實(shí)現(xiàn)相分離,從而使程序結(jié)構(gòu)更清晰。構(gòu)造器構(gòu)造器是一個類創(chuàng)建對象的根本途徑;如果一個類沒有構(gòu)造器,這個類通常將無法創(chuàng)建實(shí)例;定義:public類名([參數(shù)列表]){方法實(shí)體}在以往的程序中,我們也沒有寫構(gòu)造方法,但也一樣的可以創(chuàng)建實(shí)例,調(diào)用方法,為什么?Java提供了一個功能:如果程序中沒有為一個類編寫構(gòu)造器,則系統(tǒng)會為該類提供一個默認(rèn)的構(gòu)造器。一旦程序員為一個類提供了構(gòu)造器,系統(tǒng)將不再為該類提供構(gòu)造器。屬性定義(成員變量)屬性定義:[修飾符]

屬性類型

屬性名

[=默認(rèn)值]修飾符控制該變量的訪問權(quán)限;屬性類型:指定屬性可接受的值的類型;屬性名用以唯一標(biāo)識該變量;默認(rèn)值用以指定該屬性的初始化值;方法定義 [修飾符]方法返回值類型

方法名

([形參列表]){ -------方法實(shí)體------- } 形參類表:用于定義該方法可以接受的參數(shù)。 構(gòu)造器是一種特殊的方法,特殊在哪里呢?

一是:形式上構(gòu)造器沒有返回值(實(shí)際上是有返回值的,它的返回值為該類的實(shí)例,類型總是當(dāng)前類,因此無須定義返回值類型,它的返回值是隱式的)

二是:構(gòu)造器只能通過new關(guān)鍵字來調(diào)用。方法詳解方法是一個功能模塊;方法和實(shí)例變量都必須定義在類內(nèi),方法是類的功能接口;定義方法的原則:方法應(yīng)當(dāng)只執(zhí)行單一的任務(wù),并且方法名能有效地表達(dá)該任務(wù);

從功能上來看,方法完全類似于傳統(tǒng)結(jié)構(gòu)化程序設(shè)計里的函數(shù)。但Java里的方法不能獨(dú)立存在,所有的方法都必須定義在類里。方法在邏輯上要么屬于類,要么屬于對象。方法不能獨(dú)立存在也不能獨(dú)立執(zhí)行。方法詳解Java里方法的參數(shù)傳遞方式只有一種:值傳遞。所謂值傳遞,就是將實(shí)際參數(shù)值的副本(復(fù)制品)傳入方法內(nèi),而參數(shù)本身不會受到任何影響。對于應(yīng)用類型而言傳的是地址?;绢愋秃鸵妙愋妥鳛閰?shù)傳入方法的對比:詳見例子分析TransferTest.java。方法參數(shù)傳遞遞歸方法在一個方法的方法體實(shí)現(xiàn)里再次調(diào)用了方法本身,就是遞歸方法。使用遞歸的目的在于解決一種常見問題,即子任務(wù)只不過是開始試圖解決的相同問題的一個較簡單版本。例如文件夾的遍歷。

當(dāng)一個方法不斷地調(diào)用它本身時,必須在某個時刻方法的返回值是確定的,即不在調(diào)用它本身。否則這種遞歸就變成了無窮遞歸,類似于死循環(huán)。因此定義遞歸方法時有一條最重要的規(guī)定:遞歸一定要向已知方法遞歸。遞歸方法舉例1、縱向打印出一個數(shù)的各位上的數(shù)字。例如1234,8745,-3452打印結(jié)果如右圖所示。提示:通過number%10可獲取最后一位數(shù)字,通過number/10可以去除最后一位。遞歸方法舉例1、打印數(shù)字金字塔。對象的產(chǎn)生與使用

創(chuàng)建對象的根本途徑是構(gòu)造器,通過new關(guān)鍵字來調(diào)用某個類的構(gòu)造器即可創(chuàng)建這個類的實(shí)例。當(dāng)一個對象被創(chuàng)建成功以后,這個對象將保存在堆內(nèi)存中,Java程序不允許直接訪問堆內(nèi)存中的對象,只能通過該對象的引用操作該對象。 訪問屬性和方法的語法:

實(shí)例.屬性|方法

類.屬性|方法(只針對與static修飾的成員)static關(guān)鍵字static用于修飾方法、屬性等成員。static修飾的成員表明它是屬于這個類共有的,而不是屬于該類的實(shí)例,因此通常把static修飾的屬性和方法稱為類屬性、類方法。static修飾的成員不能訪問沒有static修飾的成員。

如果確實(shí)需要在靜態(tài)方法中訪問另一個普通的成員,則只能重新創(chuàng)建一個對象。this關(guān)鍵字this關(guān)鍵字的作用:在構(gòu)造方法中,this表示引用該類的其它的構(gòu)造方法。形式:this();在非static方法中,this代表調(diào)用該方法的當(dāng)前對象的一個引用。形式:this.方法|屬性,this所代表的對象是不確定的,但它的類型是確定的,只能是當(dāng)前類,只有當(dāng)這個方法被調(diào)用時,它所代表的對象才被確定下來:誰在調(diào)用這個方法,this就代表誰。當(dāng)不存在歧義的時候,this是可以省略的;當(dāng)存在歧義時則須顯示指出。方法重載如果同一個類中包含了兩個或兩個以上方法的方法名相同,但形參列表不同,則被稱為方法重載。(兩同、一不同):同一個類中方法名相同,參數(shù)列表不同。至于方法的其他部分,如方法返回值類型、修飾符等,與方法重載沒有任何關(guān)系。方法的返回類型不同為什么不是方法的重載?成員變量和局部變量在Java語言中,根據(jù)定義變量位置的不同,可以將變量分為2大類:成員變量和局部變量。成員變量指的是在類范圍里定義的變量;局部變量指的是在一個方法內(nèi)定義的變量。變量成員變量局部變量實(shí)例屬性(不以static修飾)形參(方法簽名中定義的變量)代碼塊局部變量(在代碼塊中定義)類屬性(以static修飾)方法局部變量(在方法內(nèi)定義)成員變量和局部變量當(dāng)系統(tǒng)加載類或創(chuàng)建該類的實(shí)例時,系統(tǒng)自動為成員變量分配內(nèi)存空間,并在分配內(nèi)存空間后,自動為成員變量指定初始值。與成員變量不同的是,局部變量除了形參之外,都必須顯示初始化。即必須指定初始值,否則不可以訪問它們。局部變量定義后,系統(tǒng)并未為這個變量分配內(nèi)存空間,直到程序為這個變量賦初始值時,系統(tǒng)才會為局部變量分配內(nèi)存,并將初始值保存到這塊內(nèi)存中。使用局部變量的地方都可以用成員變量替換,為什么還要局部變量?變量使用規(guī)則如果需要定義的變量是用于描述某個類或者某個對象的固有信息的。如果在某個類中需要以一個變量來保存該類或者實(shí)例運(yùn)行時的狀態(tài)信息。如果某個信息需要在某個類的多個方法之間進(jìn)行共享,則這個信息應(yīng)該使用成員變量來保存。局部變量的作用范圍越小,它在內(nèi)存里停留的時間就越短,程序運(yùn)行性能就越好。隱藏與封裝封裝是指將對象的狀態(tài)信息隱藏在對象內(nèi)部,不允許外部程序直接訪問對象內(nèi)部信息,而是通過該類所提供的方法來實(shí)現(xiàn)對內(nèi)部信息的操作和訪問。做法:將對象的屬性和實(shí)現(xiàn)細(xì)節(jié)隱藏起來,不允許外部直接訪問;(用private修飾符修飾)把方法暴露出來,讓方法來操作或訪問這些屬性;作用:隱藏細(xì)節(jié)、控制訪問等。訪問控制符private(私有訪問權(quán)限):表示該成員只能在該類的內(nèi)部被訪問。這個訪問控制符用于修飾屬性最合適,將屬性隱藏在類的內(nèi)部。default(包訪問權(quán)限):也是默認(rèn)訪問控制,可以被相同包下其他類訪問。protected(子類訪問權(quán)限):既可以被同一個包中其他類訪問,也可以被不同包中的子類訪問。通常是希望其子類來重寫這個方法。public(公共訪問權(quán)限):可以被所有類訪問。局部變量需要訪問控制符修飾嗎?為什么?訪問控制符使用原則類里的絕大部分屬性都應(yīng)該使用private修飾,除了一些static修飾的、類似全局變量的屬性,才可能考慮使用public修飾,工具方法也應(yīng)該使用private修飾。如果某個類主要用做其他類的父類,該類里包含的大部分方法可能僅希望被其子類重寫,而不想被外界直接調(diào)用,則應(yīng)該使用protected修飾這些方法。希望暴露出來給其他類自由調(diào)用的方法應(yīng)該使用public修飾。package關(guān)鍵字package的作用:將一組功能相關(guān)的類放在同一個package(包)下,從而組成邏輯上的類庫單元。package語句必須作為源文件的第一句非注釋性語句,一個源文件最多指定一個包,該源文件可以定義多個類,則這些類將全部位于該包下。一般建議使用公司Internet域名倒寫作為包名。當(dāng)使用帶-d選項的javac命令來編譯Java源文件時,該命令會自動建立對應(yīng)的文件結(jié)構(gòu)來存放相應(yīng)的class文件。import關(guān)鍵字如果需要使用不同包中的其他類時,需要使用該類的全名;import可以向某個Java文件中導(dǎo)入指定包層次下某個類或全部類,import語句應(yīng)該出現(xiàn)在package語句之后,類定義之前。一個Java源文件可以包含多個import語句;當(dāng)想引入同一個包中的多個類時,可以在import語句中加*號,*號只能代表類,不能代表包。Java默認(rèn)為所有源文件導(dǎo)入java.lang包下的所有類,這就是為什么可以使用System類。繼承

在面向?qū)ο蟪绦蛟O(shè)計中,繼承表示兩個類之間的一種關(guān)系,是一種由已有類創(chuàng)建新類的機(jī)制。子類不僅可以從父類中繼承成員變量和方法,還可以重新定義和擴(kuò)充新的內(nèi)容。

Java中的繼承是通過extends關(guān)鍵字來實(shí)現(xiàn)的,被繼承的類被稱為父類、基類或超類。父類和子類之間是一種一般和特殊的關(guān)系。例如水果和蘋果之間的關(guān)系。

Java中每個類最多只有一個直接父類,如果一個類沒有顯式指定這個類的直接父類,則這個類默認(rèn)擴(kuò)展java.lang.Object類,Object類是所有類的父類。繼承使用繼承方法創(chuàng)建新類時,新定義的子類可以從父類繼承所有非私有的成員變量和方法作為自己的成員,子類不能獲得父類的構(gòu)造器。在子類中,可以定義與父類完全一致的成員,此時父類成員將會被覆蓋,在子類中,默認(rèn)訪問的是子類的成員。如果想調(diào)用父類的成員,可使用super關(guān)鍵字,super代表的是直接父類的對象,它的使用類似于this關(guān)鍵字,如super.成員。

當(dāng)創(chuàng)建一個子類對象時,系統(tǒng)會首先調(diào)用父類的無參構(gòu)造方法,然后才會執(zhí)行子類的構(gòu)造方法。如果父類中不包含無參的構(gòu)造方法時,怎么辦?此時,可通過super調(diào)用指定的構(gòu)造方法。子類調(diào)用父類構(gòu)造器的情況子類構(gòu)造器執(zhí)行的第一行使用super顯式調(diào)用父類構(gòu)造器,系統(tǒng)將根據(jù)super調(diào)用傳入的參數(shù)列表調(diào)用父類對應(yīng)的構(gòu)造器;子類構(gòu)造器執(zhí)行體的第一行使用this顯式調(diào)用本類中重載的構(gòu)造器,系統(tǒng)將根據(jù)this調(diào)用里傳入的實(shí)參列表調(diào)用本類另一個構(gòu)造器。執(zhí)行本類中另一個構(gòu)造器時,即會調(diào)用父類的構(gòu)造器;子類構(gòu)造器執(zhí)行體既沒有super調(diào)用,也沒有this調(diào)用,系統(tǒng)將會在執(zhí)行子類構(gòu)造器之前,隱式調(diào)用父類無參數(shù)的構(gòu)造器。不管哪種情況,當(dāng)調(diào)用子類構(gòu)造器來初始化子類對象時,父類構(gòu)造器總會在子類構(gòu)造器之前執(zhí)行,不僅如此,執(zhí)行父類構(gòu)造器時,系統(tǒng)會再次上溯執(zhí)行器父類的構(gòu)造器…一次類推,創(chuàng)建任何Java對象,最先執(zhí)行的總是Object類的構(gòu)造器。

程序運(yùn)行后打印結(jié)果?方法的覆蓋(重寫)子類包含與父類同名方法的現(xiàn)象被稱為方法覆蓋(重寫)。方法的重寫遵循“兩同兩小一大”規(guī)則:“兩同”即方法名相同、形參列表相同,“兩小”指的是子類方法返回值類型應(yīng)比父類方法返回值類型更小或相等,子類方法聲明拋出的異常類應(yīng)比父類方法聲明拋出的異常類更小或相等?!耙淮蟆敝傅氖亲宇惙椒ǖ脑L問權(quán)限應(yīng)比父類方法更大或相等。同時,覆蓋方法和被覆蓋方法要么都是類方法,要么都是實(shí)例方法。父類中private修飾的方法對子類是透明的,如果子類中定義了一個與父類private方法具有相同方法名,相同形參列表,相同返回值類型的方法,依然不是重寫,只是在子類中重新定義了一個新方法。多態(tài)

Java引用變量有兩個類型,一個是編譯時的類型,一個是運(yùn)行時的類型,編譯時的類型由聲明該變量時使用的類型決定,運(yùn)行時的類型由實(shí)際賦給該變量的對象決定。如果編譯時類型和運(yùn)行時類型不一致,就會出現(xiàn)多態(tài)。引用變量在編譯階段只能調(diào)用其編譯時類型所具有的方法,但運(yùn)行時則執(zhí)行它運(yùn)行時類型所具有的方法。與方法不同的是,對象的屬性則不具備多態(tài)性。通過引用變量來訪問其包含的屬性時,系統(tǒng)總是試圖訪問它編譯時類所定義的屬性,而不是它運(yùn)行時類所定義的屬性。抽象類(Abstract)抽象類和抽象方法必須使用abstract修飾符來定義,有抽象方法的類只能定義成抽象類,但抽象類中可以沒有抽象方法。抽象方法和抽象類的語法規(guī)則:抽象方法不能有方法體,方法只有聲明,沒有實(shí)現(xiàn);即使抽象類里不包含抽象方法,抽象類也不能實(shí)例化;抽象類可以有構(gòu)造方法,但是不能通過new關(guān)鍵字實(shí)例化,構(gòu)造方法主要用于執(zhí)行初始化和被其子類調(diào)用。含有抽象方法的類只能被定義為抽象類。接口(Interface)

溫馨提示

  • 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

提交評論