面向?qū)ο?教案(第23講)記錄類型_第1頁
面向?qū)ο?教案(第23講)記錄類型_第2頁
面向?qū)ο?教案(第23講)記錄類型_第3頁
面向?qū)ο?教案(第23講)記錄類型_第4頁
面向?qū)ο?教案(第23講)記錄類型_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《面向?qū)ο蟪绦蛟O(shè)計》教案第23講教學(xué)對象計算機科學(xué)技術(shù)專業(yè)授課內(nèi)容8.5記錄類型8.6枚舉類型8.7注解類型8.8內(nèi)部類課程標準教學(xué)目標(一)知識目標1.學(xué)會記錄類型的定義和使用2.學(xué)會枚舉類型的定義和使用3.學(xué)會常用標準注解類型的使用4.了解內(nèi)部類的分類,掌握內(nèi)部類的使用(二)能力目標1.可熟練定義和使用記錄類型2.可熟練定義和使用枚舉類型3.能夠熟練使用內(nèi)部類解決實際問題教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時及分配(第1學(xué)時50分鐘)課堂講授30分鐘課堂練習(xí)20分鐘8.5記錄類型8.6枚舉類型學(xué)時及分配(第2學(xué)時50分鐘)課堂講授30分鐘課堂練習(xí)20分鐘8.7注解類型8.8內(nèi)部類知識點分析重點:枚舉類型記錄類型成員內(nèi)部類、匿名內(nèi)部類難點:枚舉在switch中的應(yīng)用靜態(tài)內(nèi)部類教學(xué)過程設(shè)計內(nèi)容方式問題導(dǎo)入:Java語言中所有的類都處于一個類層次結(jié)構(gòu)中,除Object類以外,所有的類都只有一個直接父類,即子類與父類之間是單繼承的關(guān)系,而不允許多重繼承。而現(xiàn)實問題類之間的繼承關(guān)系往往是多繼承的關(guān)系,為了實現(xiàn)多重繼承,Java語言通過接口使得處于不同層次、甚至互不相關(guān)的類具有相同的行為。內(nèi)容要點8.5記錄類型在Java程序開發(fā)中,我們經(jīng)常需要定義一些數(shù)據(jù)類,比如與數(shù)據(jù)庫表交互的JavaBeans類或POJO類,這些類通常使用字段表示數(shù)據(jù),然后我們要為該類定義構(gòu)造方法,為字段定義訪問方法和修改方法。這就需要程序員編寫大量的代碼。從Java16開始,如果要定義這樣的類,可以使用record關(guān)鍵字將它定義為一個記錄類型。這種數(shù)據(jù)類型提供了一種緊湊的語法來聲明一種主要用于保存數(shù)據(jù)的類。假設(shè)定義一個Customer記錄類型,它帶兩個字段name和address?!境绦?-10】Customer.javapackagecom.boda.xy;此處相當(dāng)于構(gòu)造方法publicrecordCustomer(Stringname,Stringaddress){此處相當(dāng)于構(gòu)造方法//這里可以定義記錄類型的成員}這里,類型名后面是一對括號,里面是字段的聲明,相當(dāng)于定義一個構(gòu)造方法。記錄類型與其他類型一樣被編譯成類(.class)文件。編譯器將自動添加構(gòu)造方法、equals()方法、hashCode()方法和toString()方法,并且為每個實例變量添加訪問方法?!境绦?-11】CustomerDemo.java參見教材。在記錄的主體中,還可以聲明static成員、構(gòu)造方法和實例方法,例如:自定義的構(gòu)造方法必須明確調(diào)用帶參數(shù)構(gòu)造方法publicCustomer(Stringname){自定義的構(gòu)造方法必須明確調(diào)用帶參數(shù)構(gòu)造方法this(name,null);}一個靜態(tài)變量publicstaticStringinfo="客戶";一個靜態(tài)變量一個靜態(tài)方法一個靜態(tài)方法publicstaticvoidshow(){System.out.println("顯示:"+info);}一個實例方法一個實例方法publicvoidshowName(){System.out.println("姓名:"+name);}在記錄體中還可以覆蓋超類Record中定義的方法:@OverridepublicStringtoString(){ return"姓名:"+name+",地址:"+address;} @OverridepublicinthashCode(){ returnObjects.hash(name,address);}在記錄類型中用戶還可以定義自己的方法和構(gòu)造方法,但通常不這樣做。記錄類型主要是解決用于存儲數(shù)據(jù)的普通類的一個常見問題,從為類編寫多行代碼簡化為只需一行代碼,這大大優(yōu)化了代碼并節(jié)省了程序員的錄入時間。下面對記錄類型做一簡單總結(jié):記錄類型默認繼承了java.lang.Record類,不能顯式繼承其他類。記錄類型是final的,即它不可以被繼承。每個成員變量都被加上privatefinal,對象創(chuàng)建后它們就不可變。每個成員變量都提供了public訪問方法,如name(),但不提供修改方法。提供了帶所有參數(shù)的構(gòu)造方法、toString()方法、equals()方法和hashCode()方法。8.6枚舉類型在實際應(yīng)用中,有些數(shù)據(jù)的取值被限定在幾個確定的值之內(nèi)。例如,一年有4個季度,一周有7天、一副紙牌有4種花色等。這種類型的數(shù)據(jù)可以定義為枚舉類型。8.6.1枚舉的定義和使用枚舉類型是一種特殊的引用類型,它的聲明和使用與類和接口有類似的地方。它可以作為頂層的類型聲明,也可以像內(nèi)部類一樣在其他類的內(nèi)部聲明,但不能在方法內(nèi)部聲明枚舉。枚舉類型都隱含地繼承了java.lang.Enum抽象類,Enum類又是Object類的子類,同時實現(xiàn)了Comparable接口和Serializable接口。每個枚舉類型都包含了若干方法:publicstaticE[]values():返回一個包含了所有枚舉常量的數(shù)組,這些枚舉常量在數(shù)組中是按照它們的聲明順序存儲的。publicstaticEvalueOf(Stringname):返回指定名字的枚舉常量。如果這個名字與任何一個枚舉常量的名字都不能精確匹配,將拋出IllegalArgumentException異常。publicfinalintcompareTo(Eo):返回當(dāng)前枚舉對象與參數(shù)枚舉對象的比較結(jié)果。publicfinalStringname():返回枚舉常量名。publicfinalintordinal():返回枚舉常量的順序值,該值基于常量聲明的順序,第一個常量的順序值是0,第二個常量的順序值為1,依此類推。publicStringtoString():返回枚舉常量名。下面程序定義了一個名為Direction的枚舉類型,它表示4個方向。【程序8-12】Direction.javapackagecom.boda.xy;publicenumDirection{EAST,SOUTH,WEST,NORTH;}上述聲明中,最后一個常量NORTH后面的分號可以省略,但如果枚舉中還聲明了方法,最后的分號不能省略。為了使用枚舉類型,需要創(chuàng)建一個該類型的引用,并將某個枚舉實例賦值給它。下面程序輸出每個枚舉常量名和它們的順序號?!境绦?-13】EnumDemo.javapackagecom.boda.xy;publicclassEnumDemo{publicstaticvoidmain(String[]args){//聲明一個枚舉類型變量,并用一個枚舉賦值varleft=Direction.WEST;System.out.println(left);//輸出WEST//輸出每個枚舉對象的序號for(vard:Direction.values()){System.out.println(()+",序號"+d.ordinal());}}}8.6.2在switch中使用枚舉枚舉類型可以在switch語句中使用。下面程序在switch結(jié)構(gòu)中使用DayOfWeek枚舉。【程序8-14】EnumSwitch.java8.6.3枚舉的構(gòu)造方法在枚舉類型的聲明中,除了枚舉常量外還可以聲明構(gòu)造方法,成員變量和其他方法,下面程序定義了Color枚舉,它包含4種顏色?!境绦?-15】Color.java8.7注解類型注解類型(annotationtype)以結(jié)構(gòu)化的方式為程序元素提供信息,這些信息能夠被外部工具(編譯器、解釋器等)自動處理。注解有許多用途,其中包括:為編譯器提供信息。編譯器可以使用注解檢測錯誤或阻止編譯警告。編譯時或部署時處理。軟件工具可以處理注解信息生成代碼、XML文件等。運行時處理。有些注解在運行時可以被檢查。像使用類一樣,要使用注解必須先定義注解類型(也可以使用語言本身提供的注解類型)。8.7.1注解概述注解是為Java源程序添加的說明信息,這些信息可以被編譯器等工具使用??梢越oJava包、類型(類、接口、枚舉)、構(gòu)造方法、方法、成員變量、參數(shù)及局部變量進行標注。1.注解和注解類型注解類型是一種特殊的接口類型,注解是注解類型的一個實例。就像接口一樣,注解類型也有名稱和成員。注解中包含的信息采用“鍵/值”對的形式,可以有零或多個“鍵/值”對,并且每個鍵有一個特定類型。它可以是一個Stirng、int或其他Java類型。沒有“鍵/值”對的注解類型稱作標記注解類型(markerannotationtype)。如果注解只需要一個“鍵/值”對,則稱為單值注解類型。2.注解語法在Java程序中為程序元素指定注解的語法如下:@AnnotationType或者@AnnotationType(elementValuePairs)在使用注解類型標注程序元素時,對每個沒有默認值的元素,都應(yīng)該以name=value的形式對元素初始化。初始化的順序并不重要,但每個元素只能出現(xiàn)一次。如果元素有默認值,可以不對該元素初始化,也可以用一個新值覆蓋默認值。如果注解類型是標記注解類型(無元素),或者所有的元素都具有默認值,那么就可以省略初始化器列表。如果注解類型只有一個元素,可以使用縮略的形式對注解元素初始化,即不用使用name=value的形式,而是直接在初始化器中給出唯一元素的值。8.7.2標準注解Java語言規(guī)范中定義了3個注解類型,它們是供編譯器使用的。這3個注解類型定義在java.lang包中,分別為@Override、@Deprecated和@SuppressWarnings。1.@Override注解@Override是一個標記注解類型,可以用在一個方法的聲明中,它告訴編譯器這個方法要覆蓋父類中的某個方法。使用該注解可以防止程序員在覆蓋某個方法時出錯。2.@Deprecated注解@Deprecated是一個標記注解類型,可以應(yīng)用于某個方法或某個類型,指明方法或類型已被棄用。標記已被棄用的方法或類型,是為了警告其代碼用戶,不應(yīng)該使用或者覆蓋該方法,或者不該使用或擴展該類型。一個方法或類型被標記棄用通常是因為有了更好的方法或類型。當(dāng)前的軟件版本中保留這個被棄用的方法或類型是為了向后兼容。3.@SuppressWarnings注解使用@SuppressWarnings注解指示編譯器阻止某些類型的警告,具體的警告類型可以用初始化該注解的字符串來定義。該注解可應(yīng)用于類型、構(gòu)造方法、方法、成員變量、參數(shù)以及局部變量。它的用法是傳遞一個String數(shù)組,其中包含需要阻止的警告。8.7.3定義注解類型除了可以使用Java類庫提供的注解類型外,用戶也可以定義和使用注解類型。注解類型的定義與接口類型的定義類似。注解類型的定義使用interface關(guān)鍵字,前面加上@符號。public@interfaceCustomAnnotation{//…}默認情況下,所有的注解類型都擴展了java.lang.annotation.Annotation接口。該接口定義了一個返回Class對象的annotationType()方法,如下:Class<?extendsAnnotation>annotationType()另外,該接口還定義了equals()方法、hashCode()方法和toString()方法。下面程序定義了名為ClassInfo的注解類型?!境绦?-18】ClassInfo.javapackagecom.boda.xy;public@interfaceClassInfo{Stringcreated();Stringauthor();StringlastModified();intversion();}8.8.1成員內(nèi)部類成員內(nèi)部類是沒有用static修飾且定義在外層類的類體中。在成員內(nèi)部類中可以定義自己的成員變量和方法,也可以定義自己的構(gòu)造方法。成員內(nèi)部類的訪問修飾符可以是private、public、protected或缺省。成員內(nèi)部類可以看成是外層類的一個成員,因此可以訪問外層類的所有成員(包括私有成員)。【程序8-19】Outer.java程序中Inner是Outer的成員內(nèi)部類。內(nèi)部類編譯后將單獨生成一個類文件,如上述代碼編譯后將生成兩個類文件:Outer.class和Outer$Inner.class。在外層類的方法中(如makeInner)可以直接創(chuàng)建內(nèi)部類的實例。在外層類的外面要創(chuàng)建內(nèi)部類的實例必須先創(chuàng)建一個外層類的實例,因為內(nèi)部類對象對外層類對象有一個隱含的引用。創(chuàng)建內(nèi)部類對象也可以使用下面的語句實現(xiàn):varinner=newOuter().newInner();在使用成員內(nèi)部類時需要注意下面幾個問題:成員內(nèi)部類中不能定義static變量和static方法。成員內(nèi)部類也可以使用abstract和final修飾,其含義與其他類一樣。成員內(nèi)部類還可以使用private、public、protected或包可訪問修飾符。9.3.2靜態(tài)內(nèi)部類靜態(tài)內(nèi)部類使用static修飾,靜態(tài)內(nèi)部類也稱嵌套類(nestedclass),靜態(tài)內(nèi)部類與成員內(nèi)部類的行為完全不同,下面是它們的不同之處:靜態(tài)內(nèi)部類中可以定義靜態(tài)成員,而成員內(nèi)部類不能。靜態(tài)內(nèi)部類只能訪問外層類的靜態(tài)成員。成員內(nèi)部類可以訪問外層類的實例成員和靜態(tài)成員。創(chuàng)建靜態(tài)內(nèi)部類的實例不需要先創(chuàng)建一個外層類的實例。相反,創(chuàng)建成員內(nèi)部類實例,必須先創(chuàng)建一個外層類的實例?!境绦?-20】Outer.java靜態(tài)內(nèi)部類實際是一種外部類,它不存在對外部類的引用,不通過外部類的實例就可以創(chuàng)建一個對象。程序中Outer.Inner就是靜態(tài)內(nèi)部類的完整名稱,此時必須使用完整的類名(如Outer.Inner)創(chuàng)建對象。靜態(tài)內(nèi)部類不具有任何對外層類實例的引用,因此靜態(tài)內(nèi)部類中的方法不能使用this關(guān)鍵字訪問外層類的實例成員,然而這些方法可以訪問外層類的static成員。這一點與一般類的static方法的規(guī)則相同。9.3.3匿名內(nèi)部類定義類最終目的是創(chuàng)建一個類的實例,但如果某個類的實例只使用一次,可以將類的定義和實例的創(chuàng)建在一起完成,或者說在定義類的同時就創(chuàng)建一個實例。以這種方式定義的沒有名字的類稱為匿名內(nèi)部類(anonymousinnerclass)。聲明和構(gòu)建匿名內(nèi)部類的一般格式如下:newTypeName(){/*此處為類體*/}匿名內(nèi)部類可以繼承一個類或?qū)崿F(xiàn)一個接口,這里TypeName是匿名內(nèi)部類所繼承的類或?qū)崿F(xiàn)的接口。如果實現(xiàn)一個接口,該類是Object類的直接子類。匿名類繼承類或?qū)崿F(xiàn)接口不需要使用extends或implements關(guān)鍵字。匿名內(nèi)部類不能同時繼承一個類和實現(xiàn)一個接口,也不能實現(xiàn)多個接口。由于匿名內(nèi)部類沒有名稱,所以類體中不能定義構(gòu)造方法。由于不知道類名,所以只能在定義類的同時用new關(guān)鍵字創(chuàng)建類的實例。實際上,匿名內(nèi)部類的定義、創(chuàng)建對象發(fā)生在同一個地方。另外,上式是一個表達式,它返回一個對象的引用,所以可以直接使用或?qū)⑵滟x給一個引用變量。TypeNameobj=newTypeName(){/*此處為類體*/};也可以將構(gòu)建的匿名類對象作為方法的參數(shù)。someMethod(newTypeName(){/*此處為類體*/});【程序8-21】PrintableTest.javapackagecom.boda.xy;interfacePrintable{ publicvoidprint(Stringmessage);}publicclassPrintableTest{publicstaticvoidmain(String[]args){創(chuàng)建一個匿名內(nèi)部類實例,該類實現(xiàn)了Printable接口 var

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論