第四講Java面向?qū)ο蟾呒?jí)特性課件_第1頁
第四講Java面向?qū)ο蟾呒?jí)特性課件_第2頁
第四講Java面向?qū)ο蟾呒?jí)特性課件_第3頁
第四講Java面向?qū)ο蟾呒?jí)特性課件_第4頁
第四講Java面向?qū)ο蟾呒?jí)特性課件_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五章Java面向?qū)ο蟾呒?jí)特性10/15/20221第五章Java面向?qū)ο蟾呒?jí)特性10/11/20221本章要點(diǎn)Static、final關(guān)鍵字抽象類接口包內(nèi)部類訪問控制其它10/15/20222本章要點(diǎn)Static、final關(guān)鍵字10/11/2022§5.1static關(guān)鍵字用static(靜態(tài)的)修飾的變量或方法又稱為類變量和類方法。類變量(靜態(tài)變量)在成員變量聲明時(shí)使用static關(guān)鍵字。注意點(diǎn):類變量只在系統(tǒng)加載其所在類時(shí)分配空間并初始化,實(shí)例化對(duì)象時(shí)不再分配空間,所有實(shí)例對(duì)象將共享類的靜態(tài)變量。用途可以用來在實(shí)例對(duì)象之間進(jìn)行通信10/15/20223§5.1static關(guān)鍵字用static(靜態(tài)的)修飾的類似于其他語言中的全局變量,可以用類名直接調(diào)用。如:Count.counter例題5-1static成員變量舉例(P115)類方法(靜態(tài)方法)在類的成員方法聲明中帶有static關(guān)鍵字,訪問時(shí)可通過類名訪問例題5-2static方法舉例(P117)類名Static變量10/15/20224類似于其他語言中的全局變量,可以用類類名St注意點(diǎn)靜態(tài)方法只能訪問方法體內(nèi)定義的局部變量、自己的參數(shù)和靜態(tài)變量。(因靜態(tài)方法不是通過調(diào)用對(duì)象實(shí)例,故在靜態(tài)方法中沒有this指針)子類不能重寫父類的靜態(tài)方法,不能將非靜態(tài)方法重寫為靜態(tài)的方法。main()是一個(gè)靜態(tài)方法,是程序的入口點(diǎn)可以使JVM不創(chuàng)建實(shí)例對(duì)象就可以運(yùn)行方法。

10/15/20225注意點(diǎn)10/11/20225靜態(tài)初始化程序類中不屬于任何方法體中,并以static關(guān)鍵字修飾的語句塊。如:static{I=5;System.out.println(“Staticcode:I=”+I++);}注意靜態(tài)語句塊只在加載類時(shí)執(zhí)行一次,通常用來進(jìn)行類成員變量的初始化。例題5-3:靜態(tài)語句塊與靜態(tài)變量的訪問。10/15/20226靜態(tài)初始化程序10/11/202265.2final關(guān)鍵字在Java中,可以用final關(guān)鍵字聲明類、成員方法、成員變量。被定義成final的類不能再派生子類如:Java.lang.String為一個(gè)final類。被定義為final的方法不能重寫,優(yōu)點(diǎn)是在運(yùn)行時(shí)進(jìn)行效率優(yōu)化。被定義為final的變量只能被賦值一次,常用來定義常量,變量名一般大寫。例題5-4final變量在構(gòu)造方法中賦值10/15/202275.2final關(guān)鍵字在Java中,可以用final關(guān)鍵字5.3抽象類抽象方法只有定義而沒有方法體的方法。抽象類包含一個(gè)或多個(gè)抽象方法的類。定義抽象類的格式為:abstractclass抽象類名{……}注意點(diǎn)

抽象類不能實(shí)例化。可派生子類,在子類中具體定義方法的功能。10/15/202285.3抽象類抽象方法只有定義而沒有方法體的方法。10/11

目的是為一類對(duì)象建立抽象的模型,在同類對(duì)象所對(duì)應(yīng)的體系中抽象類往往位距頂層。使類的設(shè)計(jì)變的清晰、支持多態(tài)、為類的體系提供通用的接口。10/15/20229目的是為一類對(duì)象建立抽象的模型,在同類對(duì)象所對(duì)應(yīng)的體系中Employeee=newManager();//正確Employeee=newEmployee();//錯(cuò)誤abstractclassEmployee{abstractvoidraiseSallory(inti);}ClassManagerextendsEmployee{voidraiseSallory(inti){……};}10/15/202210Employeee=newManager();5.4接口接口定義格式:[修飾符]interface接口名[extends父接]{接口體;}修飾符為public時(shí),指明任何類均可以使用這個(gè)接口。修飾符缺省時(shí),只有與該接口定義在同一個(gè)包中的類才可以訪問該接口10/15/2022115.4接口接口定義格式:10/11/202211接口的實(shí)現(xiàn)與使用implements關(guān)鍵字用來表示實(shí)現(xiàn)某個(gè)接口,在類體中可以使用接口中定義的常量,且須實(shí)現(xiàn)接口中定義的所有方法。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,在implements中用“,”分隔。例如:

PublicinterfaceFlyer{publicvoidtakeoff();publicvoidland();publicvoidfly();}10/15/202212接口的實(shí)現(xiàn)與使用PublicinterfaceFlyePublicclassAirplaneimplementsFlyer{publicvoidtakeoff(){//實(shí)現(xiàn)起飛的操作}publicvoidland(){//下落}publicvoidfly(){//起飛}}例題5-5:通過接口實(shí)現(xiàn)多態(tài)示例.10/15/202213PublicclassAirplaneimplemen多重繼承Java中規(guī)定一個(gè)類只能繼承一個(gè)父類,但可以實(shí)現(xiàn)多個(gè)接口,Java是利用接口實(shí)現(xiàn)多重繼承的。父類方法interface_1interface2……interface_n抽象或具體父類Interface_1Interface_2Interface_n子類10/15/202214多重繼承Java中規(guī)定一個(gè)類只能繼承一個(gè)父類,但可以實(shí)現(xiàn)多個(gè)通過繼承擴(kuò)展接口通過創(chuàng)建接口的子接口來增加新的方法。如:InterfaceShape{voiddraw();voiderase();}interfaceShapeAreaextendsShape{doublearea();}10/15/202215通過繼承擴(kuò)展接口通過創(chuàng)建接口的子接口來增加新的方法。Inte接口與抽象類兩者有一定的相似,又有區(qū)別接口中方法都是抽象的,而抽象類中可以定義帶有方法體的不同方法一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,而只可繼承一個(gè)抽象父類接口不是類體系的一部分,即與實(shí)現(xiàn)它的類不構(gòu)成繼承體系。抽象類通常位于類體系頂層。接口可用于多重繼承。10/15/202216接口與抽象類兩者有一定的相似,又有區(qū)別10/11/20225.5包包的概念Java中包是相關(guān)類與接口的一個(gè)集合,它提供了命名空間的管理和訪問。包具有特定的訪問控制權(quán)限。Java中編譯器把包對(duì)應(yīng)于文件系統(tǒng)的目錄和文件管理,還可以使用壓宿文件的格式存儲(chǔ)。JDK中提供的包有Java.appletJava.awtJava.event等。例如:名為Java.applet的包中,所有類文件都存儲(chǔ)在目錄classpath\java\applet下,這里classpath由環(huán)境變量來設(shè)定。10/15/2022175.5包包的概念10/11/202217包機(jī)制的優(yōu)點(diǎn)易根據(jù)包中類的功能找到所需要的類,包中的類是相關(guān)的。每個(gè)包都是命名空間,不同包中類的名字不沖突。同一個(gè)包中的類之間有比較寬松的訪問機(jī)制。包的定義與使用定義用關(guān)鍵字package如:packagegraphics;說明:

.package語句指定某類加入graphics包,并存放路徑為classpath\graphics10/15/202218包機(jī)制的優(yōu)點(diǎn)易根據(jù)包中類的功能找到所需要的類,包中的類是相關(guān).如原文件中沒有package語句,則指定為無名包,通常放在源文件的目錄下。.package只能有一條,并在源程序的第一行。.一個(gè)類只能屬于一個(gè)包.包名以“.”為分隔符10/15/202219.如原文件中沒有package語句,則指定為無名包,通常放使用包成員import語句放在源程序的前面如:importgraphics.circle//引入包中的Circle類importgraphics.*//引入包中所有的類如果沒有用import語句引入包的類,則可用長名引用類格式:包名.類名如:graphics.circlemycircle=newgraphics.circle()通常沒有必要這樣做。10/15/202220使用包成員import語句放在源程序的前面10/11/20包使用示例例5.6定義二維幾何圖形的包并使用

10/15/202221包使用示例例5.6定義二維幾何圖形的包并使用10/11/205.6訪問控制Java中有四中不同的訪問權(quán)限private-私有的protected-受保護(hù)的public-公開的缺?。╠efault)權(quán)限修飾符同一類同一包子類全局privateYdefaultY

Yprotected

Y

YYpublic

Y

YYY10/15/2022225.6訪問控制Java中有四中不同的訪問權(quán)限權(quán)限5.7內(nèi)部類內(nèi)部類是在一個(gè)類的定義中定義的類,也稱為嵌套類。內(nèi)部類可作為外包類(包容類)的一個(gè)成員使用,可以訪問外包類的所有成員(包括帶有static、private的成員變量和方法)。例題5-8內(nèi)部類訪問外包類成員(P139)例題5-9內(nèi)部類通過修飾符訪問同名外包類成員(P140)10/15/2022235.7內(nèi)部類內(nèi)部類是在一個(gè)類的定義中定義的類,也稱為嵌套類在外包類的語句塊中定義內(nèi)部類內(nèi)部類可以定義在一個(gè)方法體的語句塊中定義,這時(shí)內(nèi)部類可以訪問語句塊中的局部變量,但只限于在該語句塊運(yùn)行期內(nèi),當(dāng)該方法運(yùn)行結(jié)束后內(nèi)部類對(duì)象將不能訪問所在語句塊中的局部變量。例題5-1010/15/202224在外包類的語句塊中定義內(nèi)部類內(nèi)部類可以定義在一個(gè)方法體的語句在外包類以外的其他類中訪問內(nèi)部類對(duì)于可在外包類之外訪問的內(nèi)部類,引用內(nèi)部類時(shí)必須使用完整的標(biāo)識(shí):外包名.內(nèi)部類名假設(shè)B是A的內(nèi)部類則有Aa=newA()A.Bb=a.newB()例題5-11在外包類之外訪問內(nèi)部類10/15/202225在外包類以外的其他類中訪問內(nèi)部類對(duì)于可在外包類之外訪問的內(nèi)部內(nèi)部類的特點(diǎn):內(nèi)部類可以使用它所在類的靜態(tài)成員變量、實(shí)例成員變量和方法中的局部變量。內(nèi)部類的修飾符有abstract,private或protected。內(nèi)部類可作為其他類的成員。10/15/202226內(nèi)部類的特點(diǎn):10/11/2022265.8其它基本數(shù)據(jù)類型的包裝類集合類10/15/2022275.8其它10/11/2022275.8.1基本數(shù)據(jù)包裝類基本數(shù)據(jù)類型在java.lang包中都有一個(gè)wrapper類。

基本數(shù)據(jù)類型Wrapper類基本數(shù)據(jù)類型Wrapper類booleanBooleancharCharacterbyteBytelongLongshortShortfloatFloatintIntegerdoubleDouble10/15/2022285.8.1基本數(shù)據(jù)包裝類基本數(shù)據(jù)類型在java.lan每個(gè)包裝類中提供了有用的方法和常量MIN_VALUEMAX_VALUE數(shù)據(jù)類型的轉(zhuǎn)換

Integerwint=newInteger(18);intp=Value();intx=Integer.valueof(“123”).intValue();inty=Integer.parseInt(“123”);Strings=(newInteger(125)).toString();10/15/202229每個(gè)包裝類中提供了有用的方法和常量MIN_VALUEMAX8.2集合類集合包含一組對(duì)象。在這個(gè)對(duì)象中存放指向其他對(duì)象的引用JavaCollectionAPI的核心接口colletionListSetSortedSetMapSortedMap10/15/2022308.2集合類集合包含一組對(duì)象。在這個(gè)對(duì)象中存放指向其他對(duì)象的CollectionCollection

Collection接口是集合接口的根,它定義了集合的通用API。JDK中沒有提供該接口的實(shí)現(xiàn)類,而是提供了它的子接口。例如:SET和LISTSet

set中的元素不能重復(fù),是數(shù)學(xué)中集合的抽象ListList是一個(gè)有序的集合,稱為列表或序列??梢园貜?fù)的元素,矢量Vector就是一種常用的List。10/15/202231CollectionCollection10/11/2022MapMap實(shí)現(xiàn)鍵值到值的映射。Map中不能包含重復(fù)的鍵值,每個(gè)鍵值最多只能映射到一個(gè)值。Hashtable就是一個(gè)常用的Map。SortedSet和SortedMapSortedSet和SortedMap分別是具有排序性能的Set和Map。10/15/202232Map10/11/202232幾種常用的集合Set

Set繼承了接口Collection接口,包含的方法都是從Collection接口繼承而來。包含方法見P145在JDK中實(shí)現(xiàn)了Set接口的實(shí)用類有:HashSet類TreeSet類LinkedHashset類。HashSet類是采用Hash表實(shí)現(xiàn)了Set接口。其中元素存儲(chǔ)在一個(gè)Hash表中,并且這些元素沒有固定的順序。由于采用Hash表,當(dāng)集合中元素?cái)?shù)量較大時(shí)其訪問效率比線性表要快。10/15/202233幾種常用的集合Set10/11/202233實(shí)現(xiàn)Set的示例例題5-12Set的示例importjava.util.*;publicclassFindDups{publicstaticvoidmain(Stringargs[]){Sets=newHashSet();//創(chuàng)建一個(gè)HashSet對(duì)象,缺省的初始容量是16。

for(inti=0;i<args.length;i++){ //將命令行中的每個(gè)字符串加入到集合s中,其中重復(fù)的字符串將不能加入,并被打印輸出。if(!s.add(args[i]))System.out.println("Duplicatedetected:"+args[i]);}System.out.println(s.size()+"distinctwordsdetected:"+s);//輸出集合s的元素個(gè)數(shù)以及集合中的所有元素。}}10/15/202234實(shí)現(xiàn)Set的示例例題5-12Set的示例importjaTreeSet

TreeSet類實(shí)現(xiàn)了SortedSet接口,采用樹型結(jié)構(gòu)存儲(chǔ)集合中的元素,TreeSet對(duì)象中元素按照升序排序。LinkedHashSetLinkedHashSet類實(shí)現(xiàn)了Set接口,采用Hash表和鏈表相結(jié)合的結(jié)構(gòu)存儲(chǔ)元素。它結(jié)合了HashSet和TreeSet的優(yōu)點(diǎn),既能保證集合中元素的順序又能保證有較高的存取效率。10/15/202235TreeSet10/11/202235List

List是一種有序的集合,它繼承了Collection接口同時(shí)又增加了操作按位置存取元素查找遍歷子List的截取List接口的定義P14710/15/202236List10/11/202236JDK中提供了實(shí)現(xiàn)List接口的三個(gè)類:ArrayList類、LinkList類和Vector類。ArrayList類

ArrayList類采用可變大小的數(shù)組實(shí)現(xiàn)List接口。增加了訪問數(shù)組大小的方法。ArrayList對(duì)象會(huì)隨著元素的增加而容積自動(dòng)擴(kuò)大。ArrayList是三種類中效率最高的也是最常用的。例題:5-13List使用的示例10/15/202237JDK中提供了實(shí)現(xiàn)List接口的三個(gè)類:10/11/2022LinkList類LinkList類采用鏈表結(jié)構(gòu)實(shí)現(xiàn)List接口。除了實(shí)現(xiàn)List接口中的方法外還提供了在鏈表的頭和尾進(jìn)行g(shù)et、remove和insert等操作。利用這些操作可以用來實(shí)現(xiàn)象數(shù)據(jù)結(jié)構(gòu)中的堆棧、隊(duì)列等數(shù)據(jù)結(jié)構(gòu)。Vector類采用可變體積的數(shù)組實(shí)現(xiàn)List接口。該類同數(shù)組一樣可以通過索引序號(hào)對(duì)所包含的元素進(jìn)行訪問。10/15/202238LinkList類10/11/202238MapMap包含了一系列鍵值和值之間的映射關(guān)系。一個(gè)Map對(duì)象可以看成是一個(gè)鍵值和值對(duì)的集合,可以在該集合中通過一個(gè)鍵找到對(duì)應(yīng)的值。鍵和值可以是任意的對(duì)象。Map接口獨(dú)立于Collection接口體系的,Map接口的定義如P149。10/15/202239MapMap包含了一系列鍵值和值之間的映射關(guān)系。一個(gè)Map實(shí)現(xiàn)的5個(gè)Map接口的實(shí)用類

HashMap類、HashTable類、TreeMap類、WeekHashMap類、IdentityHashMap類HashMap類和HashTable類都使用Hash表實(shí)現(xiàn)Map接口,兩者基本等價(jià)。TreeMap類采用有序樹的結(jié)構(gòu)實(shí)現(xiàn)Map接口,同TreeMap相類似。該類按照鍵的升序的次序排列元素。WeekHashMap類與HashMap類相類似,但WeekHashMap類中的鍵——值在不被使用時(shí)會(huì)自動(dòng)刪除,由垃圾收集器回收。10/15/202240實(shí)現(xiàn)的5個(gè)Map接口的實(shí)用類10/11/202240IdentityHashMap類其特殊之處是在比較兩個(gè)鍵值是否相同是,比較的是鍵的引用,而不是鍵對(duì)象自身。上述Map類中,HashMap(無序的Map)TreeMap(有序的Map)例題5-14:利用Map進(jìn)行單詞詞頻的統(tǒng)計(jì)。10/15/202241IdentityHashMap類10/11/202241集合元素的遍歷JavaCollectionsAPI為集合提供了Iterator(重復(fù)器)用來遍歷集合中的元素。其中的方法可以使我們向前遍歷所有類型的集合。對(duì)一個(gè)Set對(duì)象的遍歷次序是不確定的。對(duì)List對(duì)象的遍歷次序是從前向后。而其子接口ListIterator支持從后向前的反向遍歷。10/15/202242集合元素的遍歷JavaCollectionsAPI為集合提Iterator接口包含兩個(gè)接口Iterator和ListIterator

publicinterfaceIterator{booleanhasNext();Objectnext();Voidremove();//刪除當(dāng)前遍歷到的元素,即刪除最近一次next()或Previous()調(diào)用返回的元素。}10/15/202243Iterator接口包含兩個(gè)接口Iterator和ListListIteratorpublicinterfaceListIteratorextendsIterator{booleanhasNext();Objectnext();booleanhasPrevious();objectprevious();intnextIndex();intpreviousIndex();remove();voidset(objecto);//可以改變當(dāng)前遍歷到的元素voidadd(objecto);//在下一個(gè)將要取得的元素之前插入新的元素。}10/15/202244ListIterator10/11/202244例題5-15:ListIterator的使用示例10/15/202245例題5-15:ListIterator的使用示例10/11枚舉、自動(dòng)裝箱和靜態(tài)導(dǎo)入枚舉枚舉——enumeration是許多編程語言都有的,但早期的版本并沒有提供枚舉。其原因就是枚舉不是必需的。但是在日常生活中非常常見,在J2SE5(2004年發(fā)布)添加了枚舉類型。10/15/202246枚舉、自動(dòng)裝箱和靜態(tài)導(dǎo)入枚舉10/11/202246enumTransport{CAR,TRUCK,AIRPLANE,TRAIN,BOAT}

Transporttp;tp=Transport.AIRPLANE;可以使用的場合if(tp==Transport.TRAIN)……switch(tp){caseCAR:……caseTRUCK:…………}注意:在case中,枚舉常量沒有使用枚舉類型名來限定。10/15/202247enumTransport{10/11/202247例題:enumTransport{CAR,TRUCK,AIRPLANE,TRAIN,BOAT}classEnumDemo{publicstaticvoidmain(Stringargs[]){Transporttp;tp=Transport.AIRPLANE;System.out.println(“valueoftp”+tp);tp=Transport.TRAIN;if(tp==Transport.TRAIN)System.out.println(“tpcontainsTrain.”);10/15/202248例題:enumTransport{10/11/202248switch(tp){caseCARSystem.out.println(“Acarcarriespeople.”);break;caseTRUCK:System.out.println(“Atruckcarriesfreight.”);break;caseAIRPLANE:System.out.println(“Aairplaneflies.”);break;caseTRAIN:System.out.println(“Atrainrunsonrails.”);break;caseBOAT:System.out.println(“Aboatsailsonwater.”);break;}}}Valueoftp:AIRPLANETpcontains

TRAIN.Atarinrunsonrails.10/15/202249switch(tp){Valueoftp:AIRPLAJava的枚舉類型是類類型從前面的例題可見,枚舉類型為類類型。但不使用new實(shí)例化enum。如:

Transporttp;tp=Transport.AIRPLANE;例題5-16:10/15/202250Java的枚舉類型是類類型從前面的例題可見,枚舉類型為類類型values()和valueof()方法所有的枚舉類型自動(dòng)地?fù)碛蟹椒ǎ簐alues()valueof()方法。其形式如下:publicstaticenum-type[]values()返回一個(gè)包含枚舉常量列表的數(shù)組publicstaticenum-typevalueof(Stringstr)返回一個(gè)枚舉常量,其值對(duì)應(yīng)于傳遞給Str的字符串。例題5-17:10/15/202251values()和valueof()方法所有的枚舉構(gòu)造方法、方法、實(shí)例變量和枚舉每個(gè)枚舉常量是一個(gè)枚舉型的對(duì)象;枚舉類型可以定義構(gòu)造函數(shù),添加方法。例題5-18:10/15/202252構(gòu)造方法、方法、實(shí)例變量和枚舉每個(gè)枚舉常量是一個(gè)枚舉型的對(duì)象自動(dòng)裝箱和自動(dòng)拆箱包裝類Integeriob=newInteger(100);inti=Value();稱為手工裝箱、手工拆箱Integeriob=10);inti=iob;

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論