新手小白进阶_枚举 enum

1 枚举引入

Java是一门面向对象的语言,当我们创建好一个类以后,可以创建这个类的多个对象
但是一个类究竟创建多少个对象,并且对象代表的值我们是无法限制的
所以,如果开发中需要一组值,需要的数据是明确的,就可以使用枚举

2 枚举概念

枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的。比如:

星期:Monday(星期一)…Sunday(星期天)
性别:Man(男)、Woman(女)
季节:Spring(春天)…Winter(冬天)
支付方式:Cash(现金)、WeChatpay(微信支付)、AliPay(支付宝支付)、BankCard(银行卡支付)、CreditCard(信用卡支付)
订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Return(退货)、Checked(已收货)

所以,如果当我们需要定义一组常量表示不同的状态时,就建议使用枚举类
JDK5以前是需要自定义枚举类的,JDK5以后可以使用关键字enum来定义枚举类
我们先来用传统class的方式来实现自定义枚举类:

3 自定义枚举类

枚举类中声明的每一个枚举值代表枚举类的一个实例对象
与Java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数
但是枚举类的构造函数必须为私有的,我们一起来练习一下:

package cn.cxy.exec;
/*本类用于自定义枚举类*/
public class SeasonTest {
    public static void main(String[] args) {
        System.out.println(Season.SPRING.getSEASON_NAME());//春季
        System.out.println(Season.SUMMER.getSEASON_DESC());//夏日炎炎
        System.out.println(Season.AUTUMN);
        //Season{SEASON_NAME='秋季', SEASON_DESC='秋高气爽'}
    }
}
//1.自定义枚举类
class Season{
    //2.定义本类的私有属性,为了防止值被修改,需要设置为final
    private final String SEASON_NAME;//季节名
    private final String SEASON_DESC;//季节描述

    //3.私有化本类的构造方法--防止外界随意创建本类对象
    private Season(String seasonName,String seasonDesc){
        this.SEASON_NAME = seasonName;//在构造中给本类的属性赋值
        this.SEASON_DESC = seasonDesc;
    }

    //4.提供当前枚举类的多个对象
    public final static Season SPRING = new Season("春季","春暖花开");
    public final static Season SUMMER = new Season("夏季","夏日炎炎");
    public final static Season AUTUMN = new Season("秋季","秋高气爽");
    public final static Season WINTER = new Season("冬季","冬雪凛凛");

    //5.生成对应的get的方法,获取本类的两个属性值
    public String getSEASON_NAME() {
        return SEASON_NAME;
    }
    public String getSEASON_DESC() {
        return SEASON_DESC;
    }
    //6.生成toString方法方便查看

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

4 使用关键字enum定义枚举类

package cn.cxy.exec;

/*本类用于使用enum关键字定义枚举类*/
public class ColorTest {
    public static void main(String[] args) {
        //6.进行测试
        System.out.println(Color.RED);//RED
        System.out.println(Color.ORANGE.getCOLOR_NAME());//橙色
        System.out.println(Color.ORANGE.getCOLOR_NUMBER());//2
    }
}

//1.使用enum关键字定义枚举类
enum Color {
    //2.写出本类对应的多个枚举对象
    /*1.public static final可以省略不写
    * 2.枚举对象不能像自定义枚举类对象时new,要按照下面的语法:
    * 枚举名1(值1,值2),枚举名2(值1,值2),枚举名3(值1,值2);
    * 3.不需要生成toString,因为使用enum关键字定义的枚举类继承了java.lang.Enum
    * 在Enum中重写了继承自Object的toString(),直接打印的就是枚举名*/
    RED("红色",1),
    ORANGE("橙色",2),
    YELLOW("黄色",3),
    GREEN("绿色",4),
    CYAN("青色",5),
    BLUE("蓝色",6),
    PURPLE("紫色",7);

    //3.定义枚举类的多个私有属性
    private final String COLOR_NAME;
    private final int COLOR_NUMBER;

    //4.定义本类的构造方法
    private Color(String colorName, int colorNumber) {
        this.COLOR_NAME = colorName;
        this.COLOR_NUMBER = colorNumber;
    }

    //5.生成属性对应的两个get()
    public String getCOLOR_NAME() {
        return COLOR_NAME;
    }
    public int getCOLOR_NUMBER() {
        return COLOR_NUMBER;
    }
}

总结:

  1. public static final可以省略不写
  2. 枚举对象不能像自定义枚举类对象时new,要按照下面的语法:
    枚举名1(值1,值2),枚举名2(值1,值2),枚举名3(值1,值2);
  3. 不需要生成toString,因为使用enum关键字定义的枚举类继承了java.lang.Enum
    在Enum中重写了继承自Object的toString(),直接打印的就是枚举名

5 实现接口的枚举类

枚举类也可以实现接口、或继承抽象类,有两种实现方案:
方案一:枚举类与接口建立实现关系,在枚举类中实现接口中定义的抽象方法
效果:每个枚举对象调用实现后的方法都是同一个效果
方案二:枚举类与接口建立实现关系,在枚举类每个枚举对象后分别实现抽象方法
效果:不同的枚举对象调用实现后的方法就是不同的效果

package cn.cxy.exec;
/*本类用于实现枚举实现接口*/
public class TestGame {
    public static void main(String[] args) {
        //8.进行测试
        Game.ROCK.show();//猜丁壳出的是石头
        Game.SCISSORS.show();//猜丁壳出的是剪刀
        Game.PAPER.show();//猜丁壳出的是布

        System.out.println(Game.ROCK.getName());//石头
        System.out.println(Game.ROCK.getNum());//0
    }
}
//6.定义接口与接口中的抽象方法
interface Info{
    void show();
}
//1.通过enum关键字定义枚举类
enum Game implements Info{
    //2.列出本类的枚举对象
    ROCK("石头",0){
        //7.2在每个枚举对象后实现接口的抽象方法
        public void show() {
            System.out.println("猜丁壳出的是石头");
        }
    },
    SCISSORS("剪刀",2){
        public void show() {
            System.out.println("猜丁壳出的是剪刀");
        }
    },
    PAPER("布",5){
        public void show() {
            System.out.println("猜丁壳出的是布");
        }
    };
    //3.定义本类的属性
    private final String name;
    private final int num;
    //4.创建本类的构造函数
    private Game(String name,int num){
        this.name = name;
        this.num = num;
    }
    //5.生成属性对应的get()
    public String getName() {
        return name;
    }
    public int getNum() {
        return num;
    }

    //7.1枚举实现接口抽象方法,方案一
//    @Override
//    public void show() {
//        System.out.println("猜丁壳游戏~");
//    }
}

6 Enum类的主要方法

String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
static <T extends Enum> T valueOf(Class enumType, String name)
返回带指定名称的指定枚举类型的枚举常量
values()此方法虽然在JDK文档中查不到,但是每个枚举类都具有该方法,它用于遍历枚举的所有枚举值

package cn.cxy.exec;

import org.junit.Test;

import java.util.Arrays;

public class TestScore {

    //测试枚举的常用方法
    @Test
    public void test3() {
        //01-返回当前枚举值的名称
        System.out.println(Score.B.name());//B
        System.out.println(Score.B.toString());//B

        //02-打印当前枚举值在枚举类中声明的顺序
        System.out.println(Score.B.ordinal());//1,第2个枚举值

        /*使用场景:
         * 实际开发中表单提交过来的值是字符串类型,需要验证此字符串是否是我们定义的枚举值
         * 如果可以转换,说明提交的字符串没有问题,是我们预先定义好的枚举值
         * 如果不可以转换,说明提交过来的字符串有误,会报非法参数异常,没有这个枚举值*/
        //03-将字符串转成对应的枚举类型,注意这个类型必须是已有的枚举值
        //String str = "Cc";//IllegalArgumentException: No enum constant cn.tedu.oop.Score.Cc
        String str = "C";
        Score score = Score.valueOf(Score.class, str);
        System.out.println(score);
        //将字符串转成枚举类型的方式2,此种推荐,简单
        System.out.println(Score.valueOf(str));

        Score[] values = Score.values();
        System.out.println(Arrays.toString(values));

    }
}

//1.使用enum关键字定义枚举类
enum Score {
    //2.列出本类的多个枚举对象
    A("100-80") {
        //7.给每个枚举对象实现刚刚步骤6定义的抽象方法
        public String localeScore() {
            return "优";
        }
    }, B("79-60") {
        public String localeScore() {
            return "中";
        }
    }, C("59-0") {
        public String localeScore() {
            return "差";
        }
    };
    //3.定义一个私有的属性,封装每个对象对应的分数
    private final String score;

    //4.定义一个私有的构造函数
    private Score(String score) {
        this.score = score;
    }

    //5.定义一个输出成绩的抽象方法
    public abstract String localeScore();

    //6.定义一个公共的获取成绩的方法
    public String getScore() {
        return this.score;
    }
}

注意1:如果枚举类中只有一个对象,则可以看做单例模式的一种实现方式

enum A {//相当于定义了一个类 class A;
    A;//相当于创建了这个类唯一的一个对象new A(); 类似于单例设计模式
}

注意2:JDK5中扩展了switch语句,除了可以接收byte short char int ,还可以接收枚举类型

7 作业需求:

编写一个关于星期几的枚举WeekDay
要求:枚举值:MON,TUE,WED,THR,FRI,SAT,SUN
该枚举要有一个方法,调用该方法返回中文格式的星期几

package cn.tedu.oop;

import org.junit.Test;

public class Demo2 {
    @Test
    public void test(){
        //6.1拿到指定的枚举名
        System.out.println(WeekDay.MON);//MON
        //6.2拿到指定的枚举名对应的值
        System.out.println(WeekDay.MON.getValue());//星期一
    }
}
//1.定义枚举类
enum WeekDay {
    //2.定义枚举类中的枚举与其对应的值
    MON("星期一"), TUE("星期二"), WES("星期三"), THR("星期四"), FRI("星期五"), SAT("星期六"), SUN("星期日");
    //3.定义枚举类中的私有属性
    private String day;
    //4.定义枚举类的构造函数
    private WeekDay(String day) {
        this.day = day;
    }
    //5.定义枚举类的方法,并获取枚举对应的值
    public String getValue(){
        return this.day;
    }
}
  • 45
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
package com.test; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class B { public static void main(String[] args) { File file = new File("c:\\a.jpg"); FileInputStream is = null; try { is = new FileInputStream(file); } catch (FileNotFoundException e2) { e2.printStackTrace(); // return rect; } BufferedImage sourceImg = null; try { sourceImg = javax.imageio.ImageIO.read(is); } catch (IOException e1) { e1.printStackTrace(); // return rect; } System.out.println("width = " + sourceImg.getWidth() + "height = " + sourceImg.getHeight()); } } package com.test; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class B { public static void main(String[] args) { File file = new File("c:\\a.jpg"); FileInputStream is = null; try { is = new FileInputStream(file); } catch (FileNotFoundException e2) { e2.printStackTrace(); // return rect; } BufferedImage sourceImg = null; try { sourceImg = javax.imageio.ImageIO.read(is); } catch (IOException e1) { e1.printStackTrace(); // return rect; } System.out.println("width = " + sourceImg.getWidth() + "height = " + sourceImg.getHeight()); } } package com.test; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class B { public static void main(String[] args) { File file = new File("c:\\a.jpg"); FileInputStream is = null; try { is = new FileInputStream(file); } catch (FileNotFoundException e2) { e2.printStackTrace(); // return rect; } BufferedImage sourceImg = null; try { sourceImg = javax.imageio.ImageIO.read(is); } catch (IOException e1) { e1.printStackTrace(); // return rect; } System.out.println("width = " + sourceImg.getWidth() + "height = " + sourceImg.getHeight()); } } package com.test; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class B { public static void main(String[] args) { File file = new File("c:\\a.jpg"); FileInputStream is = null; try { is = new FileInputStream(file); } catch (FileNotFoundException e2) { e2.printStackTrace(); // return rect; } BufferedImage sourceImg = null; try { sourceImg = javax.imageio.ImageIO.read(is); } catch (IOException e1) { e1.printStackTrace(); // return rect; } System.out.println("width = " + sourceImg.getWidth() + "height = " + sourceImg.getHeight()); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值