首页 > 编程知识 正文

小白进阶成什么,电脑小白进阶

时间:2023-05-06 13:40:04 阅读:249782 作者:1821

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; }}

总结:

public static final可以省略不写枚举对象不能像自定义枚举类对象时new,要按照下面的语法:
枚举名1(值1,值2),枚举名2(值1,值2),枚举名3(值1,值2);不需要生成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; }}
win7电脑文件夹如何加密网络ACL 私有网络 UVPCiptables-iptables配置

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。