Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
844
2025-04-03
一、枚舉類(lèi)的使用
1.類(lèi)的對(duì)象只有有限個(gè),確定的
2.當(dāng)需要定義一組常量時(shí),強(qiáng)烈建議使用枚舉類(lèi)
3.如果枚舉類(lèi)中只有一個(gè)對(duì)象,則可以作為單例模式的實(shí)現(xiàn)方式。
二、如何定義枚舉類(lèi)
方式一:jdk5.0之前,自定義枚舉類(lèi)
方式二:jdk5.0,可以使用enum關(guān)鍵字定義枚舉類(lèi)
方式一 自定義
//自定義枚舉類(lèi) class Season{ //1.聲明Season對(duì)象的屬性:private final修飾 private final String seasonName; private final String seasonDesc; //2.私有化類(lèi)的構(gòu)造器,并給對(duì)象屬性賦值 private Season(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //3.提供當(dāng)前枚舉類(lèi)的多個(gè)對(duì)象:public static final的 public static final Season SPRING = new Season("春天","春暖花開(kāi)"); public static final Season SUMMER = new Season("夏天","夏日炎炎"); public static final Season AUTUMN = new Season("秋天","秋高氣爽"); public static final Season WINTER = new Season("冬天","冰天雪地"); //4.其他訴求1:獲取枚舉類(lèi)對(duì)象的屬性 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } //4.其他訴求1:提供toString() @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }
三、Enum類(lèi)中的常用方法:
values()方法:返回枚舉類(lèi)型的對(duì)象數(shù)組。該方法可以很方便地遍歷所有的枚舉值。
valueOf(String str):可以把一個(gè)字符串轉(zhuǎn)為對(duì)應(yīng)的枚舉類(lèi)對(duì)象。要求字符串必須是枚舉類(lèi)對(duì)象的“名字”。如不是,會(huì)有運(yùn)行時(shí)異常:IllegalArgumentException。
toString():返回當(dāng)前枚舉類(lèi)對(duì)象常量的名稱(chēng)
四、使用enum關(guān)鍵字定義的枚舉類(lèi)實(shí)現(xiàn)接口的情況
情況一:實(shí)現(xiàn)接口,在enum類(lèi)中實(shí)現(xiàn)抽象方法
情況二:讓枚舉類(lèi)的對(duì)象分別實(shí)現(xiàn)接口中的抽象方法
public class SeasonTest1 { public static void main(String[] args) { Season1 summer = Season1.SUMMER; //toString():返回枚舉類(lèi)對(duì)象的名稱(chēng) System.out.println(summer.toString()); // System.out.println(Season1.class.getSuperclass()); System.out.println("****************"); //values():返回所有的枚舉類(lèi)對(duì)象構(gòu)成的數(shù)組 Season1[] values = Season1.values(); for(int i = 0;i < values.length;i++){ System.out.println(values[i]); values[i].show(); } System.out.println("****************"); Thread.State[] values1 = Thread.State.values(); for (int i = 0; i < values1.length; i++) { System.out.println(values1[i]); } //valueOf(String objName):返回枚舉類(lèi)中對(duì)象名是objName的對(duì)象。 Season1 winter = Season1.valueOf("WINTER"); //如果沒(méi)有objName的枚舉類(lèi)對(duì)象,則拋異常:IllegalArgumentException // Season1 winter = Season1.valueOf("WINTER1"); System.out.println(winter); winter.show(); } } interface Info{ void show(); } //使用enum關(guān)鍵字枚舉類(lèi) enum Season1 implements Info{ //1.提供當(dāng)前枚舉類(lèi)的對(duì)象,多個(gè)對(duì)象之間用","隔開(kāi),末尾對(duì)象";"結(jié)束 SPRING("春天","春暖花開(kāi)"){ @Override public void show() { System.out.println("春天在哪里?"); } }, SUMMER("夏天","夏日炎炎"){ @Override public void show() { System.out.println("寧夏"); } }, AUTUMN("秋天","秋高氣爽"){ @Override public void show() { System.out.println("秋天不回來(lái)"); } }, WINTER("冬天","冰天雪地"){ @Override public void show() { System.out.println("大約在冬季"); } }; //2.聲明Season對(duì)象的屬性:private final修飾 private final String seasonName; private final String seasonDesc; //2.私有化類(lèi)的構(gòu)造器,并給對(duì)象屬性賦值 private Season1(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //4.其他訴求1:獲取枚舉類(lèi)對(duì)象的屬性 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } // //4.其他訴求1:提供toString() // // @Override // public String toString() { // return "Season1{" + // "seasonName='" + seasonName + '\'' + // ", seasonDesc='" + seasonDesc + '\'' + // '}'; // } // @Override // public void show() { // System.out.println("這是一個(gè)季節(jié)"); // } }
注解的使用
Java 增加了對(duì)元數(shù)據(jù)(MetaData) 的支持, 也就是 Annotation(注解)
Annotation 其實(shí)就是代碼里的特殊標(biāo)記, 這些標(biāo)記可以在編譯, 類(lèi)加 載, 運(yùn)行時(shí)被讀取, 并執(zhí)行相應(yīng)的處理.
Annocation的使用示例
示例一:生成文檔相關(guān)的注解
示例二:在編譯時(shí)進(jìn)行格式檢查(JDK內(nèi)置的三個(gè)基本注解)
@Override: 限定重寫(xiě)父類(lèi)方法, 該注解只能用于方法
@Deprecated: 用于表示所修飾的元素(類(lèi), 方法等)已過(guò)時(shí)。通常是因?yàn)樗揎椀慕Y(jié)構(gòu)危險(xiǎn)或存在更好的選擇
@SuppressWarnings: 抑制編譯器警告
示例三:跟蹤代碼依賴(lài)性,實(shí)現(xiàn)替代配置文件功能
自定義注解:參照@SuppressWarnings定義
① 注解聲明為:@interface
② 內(nèi)部定義成員,通常使用value表示
③ 可以指定成員的默認(rèn)值,使用default定義
④ 如果自定義注解沒(méi)有成員,表明是一個(gè)標(biāo)識(shí)作用。
如果注解有成員,在使用注解時(shí),需要指明成員的值。
自定義注解必須配上注解的信息處理流程(使用反射)才有意義。
自定義注解通過(guò)都會(huì)指明兩個(gè)元注解:Retention、Target
jdk 提供的4種元注解 - 對(duì)現(xiàn)有的注解進(jìn)行解釋說(shuō)明的注解
Retention ???Target ? ?Documented ??Inherited
Documented:表示所修飾的注解在被javadoc解析時(shí),保留下來(lái)。
Inherited:被它修飾的 Annotation 將具有繼承性。
Retention:指定所修飾的 Annotation 的生命周期:SOURCE\CLASS(默認(rèn)行為)\RUNTIME?只有聲明為RUNTIME生命周期的注解,才能通過(guò)反射獲取
RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),編譯器直接丟棄這種策略的 注釋 RetentionPolicy.CLASS:在class文件中有效(即class保留) , 當(dāng)運(yùn)行 Java 程序時(shí), JVM 不會(huì)保留注解。 這是默認(rèn)值 RetentionPolicy.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留),當(dāng)運(yùn)行 Java 程序時(shí), JVM 會(huì) 保留注釋。程序可以通過(guò)反射獲取該注釋。
@Target: 用于修飾 Annotation 定義, 用于指定被修飾的 Annotation 能用于 修飾哪些程序元素。 @Target 也包含一個(gè)名為 value 的成員變量
jdk 8 中注解的新特性:可重復(fù)注解、類(lèi)型注解
1 可重復(fù)注解:① 在MyAnnotation上聲明@Repeatable,成員值為MyAnnotations.class
② MyAnnotation的Target和Retention等元注解與MyAnnotations相同。
2 類(lèi)型注解:
ElementType.TYPE_PARAMETER 表示該注解能寫(xiě)在類(lèi)型變量的聲明語(yǔ)句中(如:泛型聲明)。
ElementType.TYPE_USE 表示該注解能寫(xiě)在使用類(lèi)型的任何語(yǔ)句中。
public class AnnotationTest { public static void main(String[] args) { Person p = new Student(); p.walk(); Date date = new Date(2020, 10, 11); System.out.println(date); @SuppressWarnings("unused") int num = 10; // System.out.println(num); @SuppressWarnings({ "unused", "rawtypes" }) ArrayList list = new ArrayList(); } @Test public void testGetAnnotation(){ Class clazz = Student.class; Annotation[] annotations = clazz.getAnnotations(); for(int i = 0;i < annotations.length;i++){ System.out.println(annotations[i]); } } } //jdk 8之前的寫(xiě)法: //@MyAnnotations({@MyAnnotation(value="hi"),@MyAnnotation(value="hi")}) @MyAnnotation(value="hi") @MyAnnotation(value="abc") class Person{ private String name; private int age; public Person() { } @MyAnnotation public Person(String name, int age) { this.name = name; this.age = age; } @MyAnnotation public void walk(){ System.out.println("人走路"); } public void eat(){ System.out.println("人吃飯"); } } interface Info{ void show(); } class Student extends Person implements Info{ @Override public void walk() { System.out.println("學(xué)生走路"); } public void show() { } } class Generic<@MyAnnotation T>{ public void show() throws @MyAnnotation RuntimeException{ ArrayList<@MyAnnotation String> list = new ArrayList<>(); int num = (@MyAnnotation int) 10L; } } @Inherited @Repeatable(MyAnnotations.class) @Retention(RetentionPolicy.RUNTIME) @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE}) public @interface MyAnnotation { String value() default "hello"; } @Inherited @Retention(RetentionPolicy.RUNTIME) @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) public @interface MyAnnotations { MyAnnotation[] value(); }
Java JDK
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。