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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...