Java學習-第一部分-第二階段-第二節:枚舉和註釋

来源:https://www.cnblogs.com/wenjie2000/archive/2022/08/11/16574113.html
-Advertisement-
Play Games

枚舉和註釋 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 自定義類實現枚舉 先看一個需求 要求創建季節(Season)對象,請設計並完成。 創建Season對象有如下特點 1.季節的值是有限的幾個值(spring, summer, ...


枚舉和註釋

筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html)

自定義類實現枚舉

先看一個需求

要求創建季節(Season)對象,請設計並完成。

創建Season對象有如下特點

1.季節的值是有限的幾個值(spring, summer, autumn, winter)

2.只讀,不需要修改。

public class Test {
    public static void main(String[] args) {
        //使用
        Season spring = new Season("春天", "溫暖");
        Season winter = new Season("冬天","寒冷");
        Season summer = new Season("夏天","炎熱");
        Season autumn = new Season("秋天","涼爽");
        //autumn.setName("XXX");
        //autumn.setDesc("非常的熱..");
        //因為對於季節而已,他的對象(具體值),是固定的四個,不會有更多
        //按照這個設計類的思路,不能體現季節是固定的四個對象
        //因此,這樣的設計不好===>枚舉類[枚:一個一個舉:例舉,即把具體的對象一個一個例舉出來的類
        //就稱為枚舉類]
        Season other = new Season("紅天","~~" );
    }
}
class Season {
    private String name;
    private String desc;//描述
    public Season(String name, String desc) {this.name = name;this.desc = desc;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getDesc() { return desc;}
    public void setDesc(String desc) {this.desc = desc;}
}

解決方案-枚舉

  1. 枚舉對應英文(enumeration,簡寫enum)
  2. 枚舉是一組常量的集合。
  3. 可以這裡理解:枚舉屬於一種特殊的類,裡面只包含一組有限的特定的對象。

枚舉的二種實現方式

  1. 自定義類實現枚舉
  2. 使用enum關鍵字實現枚舉
package enum_;

public class Test {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);
        System.out.println(Season.SPRING);
    }
}

//演示定義枚舉實現
class Season {
    private String name;
    private String desc;//描述

    //定義了四個對象,固定.
    public static final Season SPRING = new Season("春天","溫暖");
    public static final Season WINTER = new Season("冬天","寒冷");
    public static final Season AUTUMN = new Season("秋天","涼爽");
    public static final Season SUIMMER = new Season("夏天","炎熱");

    //1.將構造器私有化,目的防止直接new
    //2.去掉setXxx方法,防止屬性被修改
    //3.在Season內部,直接創建固定的對象
    //4.優化,可以加入final修飾符
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

小結:進行自定義類實現枚舉,有如下特點;

  1. 構造器私有化

  2. 本類內部創建一組對象

  3. 對外暴露對象(通過為對象添加public final static修飾符)

  4. 可以提供get方法,但是不要提供set

enum關鍵字實現枚舉

使用enum來實現前面的枚舉案例,看演示,主要體會和自定義類實現枚舉不同的地方。

public class Test {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
    }
}

//演示定義枚舉實現
enum Season {
    //定義了四個對象,固定.
//    public static final Season SPRING = new Season("春天","溫暖");
//    public static final Season WINTER = new Season("冬天","寒冷");
//    public static final Season AUTUMN = new Season("秋天","涼爽");
//    public static final Season SUIMMER = new Season("夏天","炎熱");

    //如果使用了enum來實現枚舉類//1。使用關鍵字 enum替代 class
    //2. public static final Season SPRING = new Season("春天","溫暖")直接使用//SPRING("春天","溫暖"))解讀常量名(實參列表I
    //3.如果有多個常量(對象),使用,號間隔即可
    //4.如果使用enum 來實現枚舉,要求將定義常量對象,寫在前面
    SPRING("春天", "溫暖"), WINTER("冬天", "寒冷");;

    private String name;
    private String desc;//描述

    //1.將構造器私有化,目的防止直接new
    //2.去掉setXxx方法,防止屬性被修改
    //3.在Season內部,直接創建固定的對象
    //4.優化,可以加入final修飾符
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

enum關鍵字實現枚舉註意事項

  1. 當我們使用enum 關鍵字開發一個枚舉類時,預設會繼承Enum類[如何證明:用javap指令反編譯能看見繼承自Enum]

    image

  2. 傳統的public static final Season2 SPRING = new Season2("春天""溫暖");簡化成SPRING(“春天","溫暖"),這裡必須知道,它調用的是哪個構造器.

  3. 如果使用無參構造器創建枚舉對象,則實參列表和小括弧都可以省略

    enum Season {
        SPRING("春天", "溫暖"),AUTUMN;;
        private Season() {
        }
        //......
    }
    
  4. 當有多個枚舉對象時,使用,間隔,最後有一個分號結尾

  5. 枚舉對象必須放在枚舉類的行首.

舉例說明enum常用的方法的使用

  1. toString:Enum類已經重寫過了,返回的是當前對象名,子類可以重寫該方法,用於返回對象的屬性信息

  2. name:返回當前對象名(常量名),子類中不能重寫

  3. ordinal:返回當前對象的位置號,預設從0開始

  4. values:返回當前枚舉類中所有的常量(此處常量即枚舉對象)(value方法被隱藏了,源碼中找不到)

  5. valueOf:將字元串轉換成枚舉對象,要求字元串必須為已有的常量名,否則報異常!

  6. compareTo: 比較兩個枚舉常量,比較的就是編號!

public class Test {
    public static void main(String[] args) {
        //使用Season2枚舉類,來演示各種方法
        Season2 autumn = Season2.AUTUMN;
        //輸出枚舉對象的名字
        System.out.println(autumn.name());
        //ordinal()輸出的是該枚舉對象的次序/編號,從0開始編號
        // AUTUMN枚舉對象是第三個,因此輸出2
        System.out.println(autumn.ordinal());
        //從反編譯可以看出values方法,返回Season2[]
        //含有定義的所有枚舉對象
        Season2[] values = Season2.values();
        System.out.println("===遍歷取出枚舉對象(增強for)====");
        for (Season2 season : values) {//增強for迴圈
            System.out.println(season);
        }
        //valueOf:將字元串轉換成枚舉對象,要求字元串必須VT為已有的常量名,否則報異常
        // 執行流程
        // 1.根坍你輸入的“AUTUMN ”到Season2的枚舉對象去查找
        // 2.如果找到了,就返回,.如果沒有找到,就報錯
        Season2 autumn1 = Season2.valueOf("AUTUMN");
        System.out.println("autumn1=" + autumn1);
        System.out.println(autumn == autumn1);
        //compareTo:比較兩個枚舉常量,比較的就是編號
        //2.看看結果
        /*
        public final int compareTo(E o) {
            return self.ordinal - other.ordinal;
        }
        Season2.AUTUMN的編號[3] - Season2.SUMMER的編號[1]
        */
        System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));//3-1
    }
}
//演示定義枚舉實現
enum Season2 {
    //定義了四個對象,固定.
    //    public static final Season SPRING = new Season("春天","溫暖");
    //    public static final Season WINTER = new Season("冬天","寒冷");
    //    public static final Season AUTUMN = new Season("秋天","涼爽");
    //    public static final Season SUMMER = new Season("夏天","炎熱");
    //如果使用了enum來實現枚舉類//1。使用關鍵字 enum替代 class
    //2. public static final Season SPRING = new Season("春天","溫暖")直接使用//SPRING("春天","溫暖"))解讀常量名(實參列表I
    //3.如果有多個常量(對象),使用,號間隔即可
    //4.如果使用enum 來實現枚舉,要求將定義常量對象,寫在前面
    SPRING("春天", "溫暖"),
    SUMMER("夏天", "炎熱"),
    WINTER("冬天", "寒冷"),
    AUTUMN;
    Season2() {
    }
    private String name;
    private String desc;//描述
    //1.將構造器私有化,目的防止直接new
    //2.去掉setXxx方法,防止屬性被修改
    //3.在Season內部,直接創建固定的對象
    //4.優化,可以加入final修飾符
    private Season2(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {return name;}
    public String getDesc() { return desc;}
}

註意

  1. 使用enum關鍵字後,就不能再繼承其它類了,因為enum會隱式繼承Enum,而Java是單繼承機制。

  2. 枚舉類和普通類一樣,可以實現介面,如下形式。

    enum 類名 implements 介面1,介面2{}

JDK內置的基本註解類型(瞭解就行)

註解的理解

  1. 註解(Annotation)也被稱為元數據(Metadata),用於修飾解釋包、類、方法、屬性、構造器、局部變數等數據信息。
  2. 和註釋一樣,註解不影響程式邏輯,但註解可以被編譯或運行,相當於嵌入在代碼中的補充信息。
  3. 在JavaSE中,註解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE中註解占據了更重要的角色,例如用來配置應用程式的任何切麵,代替java EE舊版中所遺留的繁冗代碼和XML配置等。

基本的Annotation介紹

使用Annotation時要在其前面增加@符號,並把該Annotation當成一個修飾符使用。用於修飾它支持的程式元素

三個基本的Annotation:

  1. @Override:限定某個方法,是重寫父類方法,該註解只能用於方法
  2. @Deprecated:用於表示某個程式元素(類,方法等)已過時
  3. @SuppressWarnings:抑制編譯器警告

@Override

Override:限定某個方法,是重寫父類方法,該註解只能用於方法

class Father{
    public void fly(){
        System.out.println("Father fly.….");
    }
}
class Son extends Father {
    //解讀
    //1.@Override 註解放在fly方法上,表示子類的fly方法時重寫了父類的fly
    //2.這裡如果沒有寫@0verride還是重寫了父類fly
    //3.如果你寫了@Override註解,編譯器就會去檢查該方法是否真的重寫了父類的
    // 方法,如果的確重寫了,則編譯通過,如果沒有構成重寫,則編譯錯誤
    /*
        @Target(ElementType.HETHOD)
        @Retention(RetentionPolicy.SOURCE)
        public @interface Override {
        }
    */
    @Override  //說明
    public void fly() {
        System.out.println("Son fly...");
    }
}

> 補充說明:@interface的說明

@interface不是interface,是註解類,是jdk5.0之後加入的

>Override使用說明

  1. @Override表示指定重寫父類的方法(從編譯層面驗證),如果父類沒有fly方法,則會報錯
  2. 如果不寫@Override註解,而父類仍有public void fly00,仍然構成重寫
  3. @Override只能修飾方法,不能修飾其它類,包,屬性等等
  4. 查看@Override註解源碼為@Target(ElementType.METHOD),說明只能修飾方法
  5. @Target是修飾註解的註解,稱為元註解

@Deprecated

@Deprecated的說明

  1. 用於表示某個程式元素(類,方法等)已過時

  2. 可以修飾方法,類,欄位,包,參數等等

  3. @Target(value={CONSTRUCTOR,FIELD, LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER, TYPE})

  4. @Deprecated的作用可以做到新舊版本的相容和過渡

@Deprecated
class A{

}

@suppresswarnings

@SuppressWarnings:抑制編譯器警告

//關於SuppressWarnings作用範圍是和你放置的位置相關
//看看@SuppressWarnings 源碼
/*
    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface SuppressWarnings {
        String[] value();
    }
*/
@SuppressWarnings({"unused","unchecked"})
public class Test {
    public static void main(String[] args) {
        int i;//沒有 @SuppressWarnings({"unused"})會出現黃色警告:i沒有被使用
    }
}

>說明各種值

  1. all是忽略所有警告
  2. unchecked是忽略沒有檢查的警告
  3. rawtypes是忽略沒有指定泛型的警告(傳參時沒有指定泛型的警告錯誤)
  4. unused是忽略沒有使用某個變數的警告錯誤
  5. 其他關鍵字使用相對較少,需要可自行百度
  6. @SuppressWarnings可以修飾的程式元素為,查看@Target
  7. 生成@SupperssWarnings時,不用背,直接點擊左側的黃色提示,就可以選擇(註意可以指定生成的位置)

元註解:對註解進行註解(不重要,僅需瞭解)

元註解的基本介紹

JDK的元 Annotation用於修飾其他Annotation

元註解:本身作用不大,講這個原因主要用來輔助理解源碼。看源碼時,可以知道他是乾什麼.

元註解的種類(使用不多,瞭解,不用深入研究)

  1. Retention //指定註解的作用範圍,三種 SOURCE,CLASS,RUNTIME
  2. Target //指定註解可以在哪些地方使用
  3. Documented //指定該註解是否會在javadoc體現
  4. Inherited //子類會繼承父類註解

Retention註解

說明

只能用於修飾一個 Annotation定義,用於指定該 Annotation可以保留多長時間,@Rentention包含一個 RetentionPolicy類型的成員變數,使用@Rentention時必須為該vajue成員變數指定值:

@Retention的三種值

  1. RetentionPolicy.SOURCE:編譯器使用後,直接丟棄這種策略的註解
  2. RetentionPolicy.CLASS:編譯器將把註解記錄在class文件中.當運行Java程式時,JVM不會保留註解。這是預設值
  3. RetentionPolicy.RUNTIME:編譯器將把註解記錄在 class 文件中.當運行Java程式時,JVM會保留註解.程式可以通過反射獲取該註解

@Target

基本說明

用於修飾Annotation定義,用於指定被修飾的Annotation能用於修飾哪些程式元素.@Target也包含一個名為value的成員變數。

源碼

@Documented
@Retention(RetentionPolicy.RUNTIME)//它的作用範圍是RUNTIME
@Target(ElementType.ANNOTATION_TYPE)//這裡的ANNOTATION TYPE 說明@Target只能修飾註解
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();//可以簡單看一下ElementType的取值//通過Enum 比如:TYPE等

}

@Documented

基本說明

@Documented:用於指定被該元 Annotation修飾的Annotation類將被javadoc工具提取成文檔,即在生成文檔時,可以看到該註解。

說明:定義為Documented的註解必須設置Retention值為RUNTIME。

案例

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD,LOCAL_VARIABLE, METHOD, PACKAGE,PARAMETER, TYPE)
public @interface Deprecated {//一個Deprecated 註解@Documented,則javadoc會看到Deprecated
}

@Inherited

被它修飾的Annotation將具有繼承性.如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該註解

說明:實際應用中,使用較少,瞭解即可。

元註解:本身作用不大,講這個原因希望編程看源碼時,可以知道他是乾什麼。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在B/S系統開發中,前後端分離開發設計已成為一種標準,而VUE作為前端三大主流框架之一,越來越受到大家的青睞,Antdv是Antd在Vue中的實現。本系列文章主要通過Antdv和Asp.net WebApi開發學生信息管理系統,簡述前後端分離開發的主要相關內容,僅供學習分享使用,如有不足之處,還請指... ...
  • Teleport 是一種能夠將我們的模板移動到 DOM 中 Vue app 之外的其他位置的技術,不受父級style、v-show等屬性影響,但data、prop數據依舊能夠共用的技術;類似於 React 的 Portal。主要解決的問題 因為Teleport節點掛載在其他指定的DOM節點下,完全不 ...
  • 解決某些情況下 ECharts 餅圖多行標簽重疊問題 對於多行標簽的重疊問題,其實一直沒有一個完美的解決方案。 我能在網上查到的比較全面的解決方法就是這個:https://zhuanlan.zhihu.com/p/272710806 但我的項目中某些東西是明確的:Label的行數、字體大小、數據個數 ...
  • 在前端開發過程中,我們也有可能遇到噪點插畫風格的設計稿,應用基礎的前端開發知識,能不能實現噪點風格的樣式呢,本文主要內容主要就是通過幾個示例來實現幾種噪點效果。本文包含的知識點包括:CSS 屬性 mask 遮罩、SVG 濾鏡 feTurbulence、CSS 屬性 filter 濾鏡、CSS 屬性 ... ...
  • 本文結合自身後臺開發經驗,從高可用、高性能、易維護和低風險(安全)角度出發,嘗試總結業界常見微服務介面設計原則,幫助大家設計出優秀的微服務。 ...
  • 本文由老王將建好的書房計劃請小王來幫忙,小王卻想謀權篡位,老王通過教育他引出裝飾器設計模式,第二部分針對老王提出的建設性意見實現裝飾器模式,第三部分針對裝飾器模式在Jdk中的IO、Spring中的緩存管理器、Mybatis的運用來加強我們的理解,第四部分說明裝飾器模式和代理模式的區別及他們各自的應用... ...
  • 冪等性在我們的工作中無處不在,無論是支付場景還是下訂單等核心場景都會涉及,也是分散式系統最常遇到的問題,除此之外,也是大廠面試的重災區。 知道了冪等性的重要性,下麵我就詳細介紹冪等性以及具體的解決方案,希望對大家有所幫助@mikechen 什麼是冪等性 冪等是一個數學與電腦學概念,在數學中某一元運 ...
  • 異常 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 運行下麵的代碼,看看有什麼問題->引出異常和異常處理機制 public static void main(String[] args) { int num1 =10; int n ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...