欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java基礎(chǔ)之枚舉Enum類案例詳解

 更新時(shí)間:2021年05月07日 14:43:00   作者:辰兮要努力  
這篇文章主要介紹了Java基礎(chǔ)之枚舉Enum類案例詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下

一、文章序言

Java中引用類型:數(shù)組、類、接口、枚舉、注解

枚舉這個(gè)既熟悉又陌生的東西具體再哪里可以使用呢?

在這里插入圖片描述

什么是枚舉?

枚舉是一個(gè)引用類型,枚舉就是一個(gè)規(guī)定了取值范圍的變量類型。

枚舉變量不能使用其他的數(shù)據(jù),只能使用枚舉中常量賦值。提高程序安全性;

//格式:
 public enum 枚舉名{ 
          //枚舉的取值范圍 
          //枚舉中可以生命方法 
} 

枚舉的使用場(chǎng)景介紹?

1、最常見的情況如星期,相關(guān)變量我們會(huì)在Java里面重復(fù)使用,在這里我們就可以來定義一個(gè)叫做“星期”的枚舉。

public enum Day
{
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY
}

如果不定義成枚舉,各位的寫法就千奇百怪了,比如“周一”、“星期一”、“Monday”等,寫法千奇百怪,定義枚舉一目了然。

2、比如說季節(jié)的春夏秋冬,我們同樣可以定義一個(gè)這樣的變量來存儲(chǔ)對(duì)應(yīng)的季節(jié)。

public enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;
}

3、英雄聯(lián)盟里面,有很多職業(yè),比如說”戰(zhàn)士“、”法師“、”射手“……等職業(yè)。我們就可以定義一個(gè)叫”職業(yè)“的枚舉類型;后臺(tái)再其它地方哪里需要直接引用即可;

總結(jié):枚舉里面定義的就相當(dāng)于是已經(jīng)生成且固定的對(duì)象,你可以直接使用;如果Java代碼里面與如上需要定義的常量可以直接定義一個(gè)枚舉類;

在這里插入圖片描述

定義枚舉類型時(shí)本質(zhì)上就是定義一個(gè)類別,只不過很多細(xì)節(jié)由編譯器幫我們完成了,所以某些程度上,enum關(guān)鍵字的作用 就像是class或interface

1 枚舉的本質(zhì):其實(shí)就是終止類,并繼承Enum抽象類。

2 枚舉中的變量,其實(shí)就是一個(gè)當(dāng)前類型的靜態(tài)常量。

解釋:

當(dāng)我們使用“enum”定義枚舉類型時(shí),實(shí)質(zhì)上我們定義出來的類型繼承自java.lang.Enum類型,而枚舉的成員其實(shí)就是我們定義的枚舉類型的一 個(gè)實(shí)例(Instance),他們都被預(yù)設(shè)為final,所以我們無法改變他們,他們也是static成員,所以我們可以通過類型名稱直接使用他們,當(dāng)然最重要的,他們都是公開的(public)。

二、代碼實(shí)踐

先定義一個(gè)枚舉:季節(jié)枚舉

//聲明一個(gè)表示季節(jié)的枚舉
public enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;
}

枚舉可以搭配switch語句使用:案例如下

public class TestSeasonEnum {
    public static void main(String[] args) {
        Season season = Season.SPRING;
        //switch小括號(hào)中的表達(dá)式類型可以是枚舉類型
        switch(season){
            //每個(gè)case后的常量直接寫枚舉的取值范
        case SPRING:
            System.out.println("春天");
            break;
        case SUMMER:
            System.out.println("夏天");
            break;
        case AUTUMN:
            System.out.println("秋天");
            break;
        case WINTER:
            System.out.println("冬天");
            break;
        }
    }
}

輸出結(jié)果

春天

為了加深理解,再舉例一個(gè)錯(cuò)誤的用法

​ An enum switch case label must be the unqualified name of an enumeration constant
在這里插入圖片描述

注意,在switch中,不能使用枚舉類名稱,因?yàn)榫幾g器會(huì)根據(jù)switch()的類型來判定每個(gè)枚舉類型,在case中必須直接給出與()相同類型的枚舉選項(xiàng),而不能再有類型。

在這里插入圖片描述

代碼如上可以直接測(cè)試,建議實(shí)測(cè)

三、面試相關(guān)

來來來,剛好抽時(shí)間一起整理一下常見面試問題吧,然后相關(guān)解析已經(jīng)附上詳細(xì)代碼學(xué)習(xí),實(shí)踐實(shí)踐再實(shí)踐!

在這里插入圖片描述

1.枚舉允許繼承類嗎?

枚舉類使用enum定義后在編譯后默認(rèn)繼承了java.lang.Enum類,而不是普通的繼承Object類。enum聲明類繼承了Serializable和Comparable兩個(gè)接口。且采用enum聲明后,該類會(huì)被編譯器加上final聲明(同String),故該類是無法繼承的。

所有枚舉類都默認(rèn)是Enum類的子類,無需我們使用extends來繼承。

2.枚舉允許實(shí)現(xiàn)接口嗎?

枚舉允許實(shí)現(xiàn)接口。因?yàn)槊杜e本身就是一個(gè)類,類是可以實(shí)現(xiàn)多個(gè)接口的。

public interface EnumInterface {
    public abstract void print();
}
public enum SizeEnum implements EnumInterface{
    BIG,MIDDLE,SMALL;

    @Override
    public void print() {
        System.out.println("繼承接口-重寫方法一次");
    }
}

3.枚舉可以用等號(hào)比較嗎?

肯定,因?yàn)樵贓num類里面,已經(jīng)重寫了equals方法,而方法里面比較就是直接使用==,來比較2個(gè)對(duì)象的。所以,你在外邊直接使用==也是可以的。

在這里插入圖片描述

4.可以繼承枚舉嗎?

當(dāng)然不能呀,枚舉類默認(rèn)繼承了java.lang.Enum類,一個(gè)類怎么能繼承兩個(gè)類呢?

5.枚舉可以實(shí)現(xiàn)單例模式嗎?

枚舉本身就是一種對(duì)單例設(shè)計(jì)模式友好的形式,它是實(shí)現(xiàn)單例模式的一種很好的方式。

public class InstanceDemo {

    /**
     * 構(gòu)造方法私有化
     */
    private InstanceDemo(){

    }

    /**
     * 返回實(shí)例
     * @return
     */
    public static InstanceDemo getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

    /**
     * 使用枚舉方法實(shí)現(xiàn)單利模式
     */
    private enum Singleton {
        INSTANCE;

        private InstanceDemo instance;

        /**
         * JVM保證這個(gè)方法絕對(duì)只調(diào)用一次
         */
        Singleton() {
            instance = new InstanceDemo();
        }

        public InstanceDemo getInstance() {
            return instance;
        }
    }

//測(cè)試一下
    public static void main(String[] args) {
        InstanceDemo one =  InstanceDemo.getInstance();
        InstanceDemo two =  InstanceDemo.getInstance();
        System.out.println(one);
        System.out.println(two);
        System.out.println(one == two);
    }
}

創(chuàng)建的對(duì)象相同

csdn.test.recursion.demo.InstanceDemo@74a14482
csdn.test.recursion.demo.InstanceDemo@74a14482
true

6.當(dāng)使用compareTo()比較枚舉時(shí),比較的是什么?

int compareTo(E e):比較兩個(gè)枚舉常量誰大誰小,其實(shí)比較的就是枚舉常量在枚舉類中聲明的順序;返回值可以仔細(xì)看看源碼;

一起看看,底層代碼吧

 public final int compareTo(E o) {
        Enum<?> other = (Enum<?>)o;
        Enum<E> self = this;
        if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }

舉個(gè)例子你就能理解了

public class TestSeasonEnum {
    public static void main(String[] args) {
    
        Season season = Season.SPRING;
        Season season1 = Season.SUMMER;
        Season season2 = Season.AUTUMN;
        Season season3 = Season.WINTER;

        System.out.println(season.compareTo(season1));
        System.out.println(season.compareTo(season2));
        System.out.println(season.compareTo(season3));
    }
}

輸出結(jié)課,詳情參考源碼一看便知道

-1
-2
-3

7. 當(dāng)使用equals()比較枚舉的時(shí)候,比較的是什么?

枚舉類型的equals()方法比較的是枚舉類對(duì)象的內(nèi)存地址,作用與等號(hào)等價(jià)。

到此這篇關(guān)于Java基礎(chǔ)之枚舉Enum類案例詳解的文章就介紹到這了,更多相關(guān)Java枚舉Enum類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置

    Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置

    這篇文章主要為大家介紹了Java開啟JMX遠(yuǎn)程監(jiān)控的服務(wù)配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • mybatis中幾種typeHandler的定義使用詳解

    mybatis中幾種typeHandler的定義使用詳解

    本文主要介紹了mybatis中幾種typeHandler的定義使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • MyBatis-Plus實(shí)現(xiàn)對(duì)查詢結(jié)果進(jìn)行分頁的基本步驟

    MyBatis-Plus實(shí)現(xiàn)對(duì)查詢結(jié)果進(jìn)行分頁的基本步驟

    MyBatis-Plus 是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,MyBatis-Plus 支持多種數(shù)據(jù)庫的分頁查詢,其分頁功能是通過 Page 類實(shí)現(xiàn)的,本文介紹了使用 MyBatis-Plus 實(shí)現(xiàn)分頁查詢的基本步驟,需要的朋友可以參考下
    2024-08-08
  • Java新特性中Preview功能如何運(yùn)行調(diào)試詳解

    Java新特性中Preview功能如何運(yùn)行調(diào)試詳解

    這篇文章主要為大家介紹了Java新特性中Preview功能如何運(yùn)行調(diào)試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java網(wǎng)絡(luò)編程基礎(chǔ)用法詳解

    Java網(wǎng)絡(luò)編程基礎(chǔ)用法詳解

    網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來,本文將帶大家詳細(xì)了解Java的網(wǎng)絡(luò)編程,文中有相關(guān)的代碼示例,需要的朋友可以參考下
    2023-05-05
  • Springboot+WebSocket+Netty實(shí)現(xiàn)在線聊天/群聊系統(tǒng)

    Springboot+WebSocket+Netty實(shí)現(xiàn)在線聊天/群聊系統(tǒng)

    這篇文章主要實(shí)現(xiàn)在好友添加、建群、聊天對(duì)話、群聊功能,使用Java作為后端語言進(jìn)行支持,界面友好,開發(fā)簡單,文章中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-08-08
  • Java操作數(shù)據(jù)庫(行級(jí)鎖,for update)

    Java操作數(shù)據(jù)庫(行級(jí)鎖,for update)

    這篇文章主要介紹了Java操作數(shù)據(jù)庫(行級(jí)鎖,for update),文章圍繞Java操作數(shù)據(jù)庫的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2021-12-12
  • 使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    MyBatis 是一個(gè)基于 java 的持久層框架,它內(nèi)部封裝了 jdbc,極大提高了我們的開發(fā)效率,文中給大家介紹了MybatisPlus常用API-增刪改查功能,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Java中equals()知識(shí)點(diǎn)總結(jié)

    Java中equals()知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是關(guān)于Java中equals()知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-03-03
  • 實(shí)戰(zhàn)SpringBoot集成JWT實(shí)現(xiàn)token驗(yàn)證

    實(shí)戰(zhàn)SpringBoot集成JWT實(shí)現(xiàn)token驗(yàn)證

    本文詳細(xì)講解了SpringBoot集成JWT實(shí)現(xiàn)token驗(yàn)證,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12

最新評(píng)論