Java語言程序設(shè)計 課件 第11章 記錄、枚舉和注解類型_第1頁
Java語言程序設(shè)計 課件 第11章 記錄、枚舉和注解類型_第2頁
Java語言程序設(shè)計 課件 第11章 記錄、枚舉和注解類型_第3頁
Java語言程序設(shè)計 課件 第11章 記錄、枚舉和注解類型_第4頁
Java語言程序設(shè)計 課件 第11章 記錄、枚舉和注解類型_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java語言程序設(shè)計第11章記錄、枚舉和注解類型

1記錄類型23主要內(nèi)容Java語言程序設(shè)計(第4版)清華大學(xué)出版社2022枚舉類型注解類型Java語言程序設(shè)計11.1記錄類型在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,那么該類可能需要如下定義。packagecom.boda.xy;publicrecordCustomer(Stringname,Stringaddress){//這里可以定義記錄類型的成員}這里,類型名后面是一對括號,里面是字段的聲明,這相當(dāng)于定義一個構(gòu)造方法。記錄類型與其他類型一樣被編譯成類(.class)文件。對于記錄類型,編譯器將自動添加構(gòu)造方法、equals()方法、hashCode()方法和toString()方法,并且為每個實例變量添加訪問方法(但不提供修改方法)。程序11.1Customer.java如果我們反編譯Customer.class文件,可得到類似下面的代碼。publicfinalclassCustomerextendsjava.lang.Record{privatefinaljava.lang.Stringname;privatefinaljava.lang.Stringaddress;publicCustomer(java.lang.Stringname,java.lang.Stringaddress){/*編譯的代碼*/}publicjava.lang.Stringname()

{/*編譯的代碼*/}publicjava.lang.Stringaddress()

{/*編譯的代碼*/}publicfinaljava.lang.StringtoString()

{/*編譯的代碼*/}publicfinalinthashCode()

{/*編譯的代碼*/}publicfinalbooleanequals(java.lang.Objecto)

{/*編譯的代碼*/}可以看到,聲明的Customer類繼承了java.lang.Record類,Customer類和它的兩個成員被聲明為final,也就是記錄類型不能被繼承,成員也不能被修改。記錄類型編譯器自動為它添加構(gòu)造方法、equals()方法、hashCode()方法和toString()方法,并且為實例變量添加訪問方法。注意,這里的訪問方法名為實例名,如name()、address()等,而不是getName()這種形式的。publicclassCustomerDemo{publicstaticvoidmain(String[]args){varcustomer=newCustomer("張明月","北京市海淀區(qū)");

varcustomer2=newCustomer("李大海","上海市科技路20號");

System.out.println("姓名:"+customer.name());

System.out.println("地址:"+customer.address());

System.out.println(customer.toString());

System.out.println(customer.equals(customer2));System.out.println(customer.hashCode());System.out.println(customer2.hashCode());}}程序11.2CustomerDemo.java在記錄的主體中,還可以聲明static成員、構(gòu)造方法和實例方法,例如:publicCustomer(Stringname){this(name,null);}記錄類型publicstaticStringinfo="客戶";publicstaticvoidshow(){System.out.println("顯示:"+info);}自定義構(gòu)造方法必須明確調(diào)用帶參數(shù)構(gòu)造方法自定義靜態(tài)變量和靜態(tài)方法publicvoidshowName(){System.out.println("姓名:"+name);

}記錄類型【注意】

不能在記錄類型中聲明實例變量,但可以聲明靜態(tài)變量?!咀⒁狻?/p>

記錄類型字段的訪問器名是“屬性名()”,而不是getXxx(),例如,假設(shè)記錄類型有一個name屬性,則它的訪問器為name(),而不是getName()。此外,記錄類型沒有修改方法,也就是沒有類似的setName()方法。實例方法在記錄體中還可以覆蓋超類Record中定義的方法,下面代碼覆蓋了toString()方法和hashCode()方法。記錄類型@OverridepublicStringtoString(){ return"姓名:"+name+",地址:"+address;} @OverridepublicinthashCode(){ returnObjects.hash(name,address);}在記錄類型中用戶還可以定義自己的方法和構(gòu)造方法,但通常不這樣做。記錄類型主要是解決用于存儲數(shù)據(jù)的普通類的一個常見問題??偨Y(jié)下面對記錄類型做一簡單總結(jié):記錄類型默認(rèn)繼承了java.lang.Record類,不能顯式繼承其他類。記錄類型是final的,即它不可以被繼承。每個成員變量都被加上privatefinal,對象創(chuàng)建后它們就不可變。每個成員變量都提供了public訪問方法,如name(),但不提供修改方法。提供了帶所有參數(shù)的構(gòu)造方法、toString()方法、equals()方法和hashCode()方法。1.定義一個名為Book的記錄類型,要求它實現(xiàn)Serializable接口和Comparable接口,Book記錄包含5個字段,如下所示。idint,nameString,authorString,pricedouble,pressString編程練習(xí)Java語言程序設(shè)計11.2枚舉類型在實際應(yīng)用中,有些數(shù)據(jù)的取值被限定在幾個確定的值之內(nèi)。例如,一年有4個季度,一周有7天、一副紙牌有4種花色等。對這種類型的數(shù)據(jù)可以定義為枚舉類型。11.2.1枚舉類型的定義枚舉類型是一種特殊的引用類型,它的聲明和使用與類和接口有類似的地方。枚舉類型的聲明使用enum關(guān)鍵字。下面程序定義了一個名為Direction的枚舉類型:

publicenumDirection{EAST,SOUTH,WEST,NORTH;}編譯后產(chǎn)生一個Direction.class類文件枚舉類型都隱含地繼承了java.lang.Enum抽象類,Enum類又是Object類的子類,同時實現(xiàn)了Comparable接口。每個枚舉類型都包含了若干方法,下面是一些常用的。

staticE[]values()

staticEvalueOf(Stringname)

finalintcompareTo(Eo)

finalStringname()

finalintordinal()11.2.2枚舉類型的方法publicstaticvoidmain(String[]args){//聲明一個枚舉類型變量,并用一個枚舉賦值varleft=Direction.WEST;System.out.println(left);//輸出:WEST//輸出每個枚舉對象及序號for(Directiond:Direction.values()){System.out.println(()+",序號"+d.ordinal());}}程序11.4DirectionDemo.java枚舉類型有一個特別實用的特性,它可以在switch語句中使用。java.time.DayOfWeek是一個枚舉類型,其中包括一周的7天,分別為MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY和SUNDAY,序號從0到6。EnumSwitch.java程序在switch結(jié)構(gòu)中使用DayOfWeek枚舉。11.2.3枚舉在switch中的應(yīng)用publicstaticvoiddescribe(DayOfWeekday){switch(day){caseMONDAY->System.out.println("Mondaysarebad.");caseFRIDAY->System.out.println("Fridaysarebetter.");caseSATURDAY,SUNDAY->System.out.println("Weekendsarebest.");default->System.out.println("Midweekdaysareso-so.");}}程序11.5EnumSwitch.javapublicstaticvoidmain(String[]args){varfirstDay=DayOfWeek.MONDAY;describe(firstDay);varthirdDay=DayOfWeek.WEDNESDAY;describe(thirdDay);varseventhDay=DayOfWeek.SUNDAY;describe(seventhDay);}在枚舉類型的聲明中,除了枚舉常量外還可以聲明構(gòu)造方法,成員變量和其他方法。下面程序定義了Color枚舉,它包含4種顏色。11.2.4枚舉類型的構(gòu)造方法publicenumColor{

RED("紅色",1),GREEN("綠色",2),WHITE("白色",3),YELLOW("黃色",4);

//成員變量privateStringname;privateintindex;

//構(gòu)造方法privateColor(Stringname,intindex){=name;this.index=index;

}程序11.6Color.java

//普通方法publicstaticStringgetName(intindex){for(Colorc:Color.values()){if(c.getIndex()==index){return;

}

}returnnull;

}//getter和setter方法publicStringgetName(){returnname;

}publicvoidsetName(Stringname){=name;

}publicintgetIndex(){returnindex;

}publicvoidsetIndex(intindex){this.index=index;

}

//覆蓋方法@OverridepublicStringtoString(){return+"_"+this.index;

}publicstaticvoidmain(String[]args){Colorc=Color.RED;//自動調(diào)用構(gòu)造方法System.out.println(c.toString());//輸出:1-紅色

}Java語言程序設(shè)計11.3注解類型注解以結(jié)構(gòu)化的方式為程序元素提供信息,這些信息能夠被外部工具(編譯器、解釋器等)自動處理。注解類型注解有許多用途,其中包括:

為編譯器提供信息。

編譯時或部署時處理。

運(yùn)行時處理。區(qū)分注解類型和注解注解類型是一種特殊的接口類型,像使用類一樣,要使用注解必須先定義注解類型(也可以使用語言本身提供的注解類型)。11.3.1注解概述注解是注解類型的一個實例。就像接口一樣,注解類型也有名稱和成員。注解中包含的信息采用“鍵/值”對的形式,可以有零或多個“鍵/值”對,并且每個鍵有一個特定類型。它可以是一個Stirng、int或其他Java類型。沒有“鍵/值”對的注解類型稱作標(biāo)記注解類型。如果注解只需要一個“鍵/值”對,則稱為單值注解類型。11.3.1注解概述在Java程序中為程序元素標(biāo)注注解的語法如下:

@AnnotationType或者

@AnnotationType(elementValuePairs)對沒有默認(rèn)值的元素,都應(yīng)該以name=value的形式對元素初始化。如果注解類型是標(biāo)記注解類型(無元素),或者所有的元素都具有默認(rèn)值,那么就可以省略初始化器列表。11.3.1注解概述如果注解類型只有一個元素,可以使用縮略的形式對注解元素初始化。例如,假設(shè)注解類型Copyright只有一個String類型的元素,用它注解程序元素時就可以寫作:

@Copyright("copyright2010-2015")11.3.1注解概述可以給Java包、類型(類、接口、枚舉)、構(gòu)造方法、方法、成員變量、參數(shù)及局部變量進(jìn)行標(biāo)注。例如,可以給一個Java類進(jìn)行標(biāo)注,以便阻止javac程序可能發(fā)出的警告,也可以對一個要覆蓋的方法進(jìn)行標(biāo)注,讓編譯器知道你是要覆蓋這個方法而不是重載它。這里介紹Java語言規(guī)范中定義的3個注解類型,它們是供編譯器使用的。它們定義在java.lang包中,分別為@Override@Deprecated@SuppressWarnings11.3.2標(biāo)準(zhǔn)注解@Override是一個標(biāo)記注解類型,可以用在一個方法的聲明中,它告訴編譯器這個方法要覆蓋父類中的某個方法。使用該注解可以防止程序員在覆蓋某個方法時出錯。例如,考慮下面的Parent類:

classParent{

publicdoublecalculate(doublex,doubley){

returnx*y;

}}假設(shè)現(xiàn)在要擴(kuò)展Parent類,并覆蓋它的calculate()方法。下面是Parent類的一個子類:

classChildextendsParent{

publicintcalculate(intx,inty){

return(x+1)*y;

}}Child類可以編譯。然而,Child類中的calculate()方法并沒有覆蓋Parent中的方法,因為它的參數(shù)是2個int型,而不是2個double型。使用Override注解就可以很容易防止這類錯誤。每當(dāng)你想要覆蓋一個方法時,就在這個方法前聲明Override注解類型:classChildextendsParent{

@Override

publicintcalculate(intx,inty){

return(x+1)*y;

}}@Deprecated是一個標(biāo)記注解類型,可以應(yīng)用于某個方法或某個類型,指明方法或類型已被棄用。警告代碼用戶不應(yīng)該使用或者覆蓋該方法,或者不該使用或擴(kuò)展該類型。一個方法或類型被標(biāo)記棄用通常是因為有了更好的方法或類型。2.@Deprecated注解下面代碼使用了Deprecated注解。@DeprecatedpublicvoidbadMethod(){

System.out.println("Deprecated");

}

publicstaticvoidmain(String[]args){

DeprecatedDemo

dd=newDeprecatedDemo();

dd.badMethod();}在Eclipse中棄用的方法加刪除線調(diào)用被棄用的方法也加刪除線@SuppressWarnings注解指示編譯器阻止某些類型的警告,具體警告類型可以用初始化該注解的字符串來定義。該注解可應(yīng)用于類型、構(gòu)造方法、方法、成員變量、參數(shù)以及局部變量。它的用法是傳遞一個String數(shù)組,其中包含需要阻止的警告。語法如下:

SuppressWarnings(value={string-1,…,string-n})3.@SuppressWarnings注解以下是SuppressWarnings注解的常用有效參數(shù):unchecked,未檢查的轉(zhuǎn)換警告。deprecation,使用了不推薦使用的方法的警告。serial,實現(xiàn)Serializable接口但沒有定義serialVersionUID常量的警告。rawtypes,如果使用舊的語法創(chuàng)建泛型類對象時發(fā)出的警告。finally,任何finally子句不能正常完成的警告。fallthrough,switch塊中某個case后沒有break語句的警告。3.@SuppressWarnings注解下面程序阻止了代碼中出現(xiàn)的幾種編譯警告。@SuppressWarnings(value={"unchecked","serial","deprecation"})publicclassSuppressWarningDemoimplementsSerializable{publicstaticvoidmain(String[]args){Dated=newDate();

System.out.println(d.getDay());ListmyList=newArrayList();//該語句仍然有警告

myList.add("one");

myList.add("two");

myList.add("three");

System.out.println(myList);}}程序11.7SuppressWarningDemo.java用戶也可以定義注解類型。注解類型的定義與接口類型的定義類似。注解類型的定義使用interface關(guān)鍵字,前面加上@符號。

public@interfaceCustomAnnotation{

//元素或?qū)傩月暶?/p>

}在注解類型中聲明的方法稱為注解類型的元素,它的聲明類似于接口中的方法聲明,沒有方法體,但有返回類型。11.3.3定義注解類型元素的類型有一些限制,如只能是基本類型、String、枚舉類型、其他注解類型等,并且元素不能聲明任何參數(shù)。在定義注解時可以使用default關(guān)鍵字為元素指定默認(rèn)值。例如:

public@interfaceVersion{intmajor()default1;intminor()default0;}11.3.3定義注解類型Version注解類型可以用來

溫馨提示

  • 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

提交評論