为什么要用枚举?

比如要定义星期几,有的人用1-7,而有的用0-6,这就很容易导致问题的出现

枚举就是要让某个类型的变量的取值只能为若干个值中的一个,否则,编译器报错,枚举可以让编译器在编译时期就可以检测出源程序填写的非法值,而用普通变量模拟枚举的方法无法实现这一目标

用普通类来模拟实现枚举功能:

1.将构造方法私有

2.每个元素分别有一个公用的静态成员变量

3.可以有若干个公有方法或抽象方法,而采用抽象方法定义的nextDay就将大量的if..else变换成一个一个独立的类

class WeekDay {

private WeekDay(){}

public final static WeekDay SUN = new WeekDay();

public final static WeekDay MON = new WeekDay();

public WeekDay nextDay(){

return (this==SUN)?MON:SUN;

}

public String toString(){

return (this==MON)?"MON":"SUN";

}

}

public class EnumDemo {

public static void main(String[] args) {

System.out.println(WeekDay.SUN.nextDay());

}

}

也可以是将方法定义为抽象的,每个固定的WeekDay对象的子类去复写的

在一个类中编写完各个枚举类和测试调用类,那么就可以将枚举类定义成调用类的内部类

public abstract class WeekDay {

private WeekDay(){}

public final static WeekDay SUN = new WeekDay(){

public WeekDay nextDay() {

return MON;

};

};

public final static WeekDay MON = new WeekDay(){//匿名内部类,子类来写nextDay方法

public WeekDay nextDay() {

return SUN;

};

};

public abstract WeekDay nextDay();

public String toString(){

return (this==MON)?"MON":"SUN";

}

}

顺便复习一下:

class Demo{}

new Demo(){}  ->new 一个Demo的子类,{}中是子类的代码,这个表示,子类调用的是父类的无参的构造方法

new Demo(20){} ->new子类的实例对象,调用父类的有参的构造方法

枚举的基本应用:

定义一个Week的枚举

枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以用WeekDay.SUN.getClass().getName();

public class EnumDemo {

public static void main(String[] args) {

System.out.println(WeekDay.SUN.nextDay());

Week w = Week.SUN;

System.out.println(w);

System.out.println(w.name());

System.out.println(w.ordinal());//排第几

System.out.println(w.getClass());

System.out.println(Week.valueOf("SUN"));//将字符串变换成对应的枚举元素

System.out.println(Week.values().length);//将枚举中的每一个元素,都装进数组

}

public enum Week{//定义一个枚举类

SUN,MON;

}

}

实现带有构造方法的枚举

public enum Week{//定义一个枚举类

SUN,MON;//所有的东西都必须放在枚举值列表下面

private Week(){System.out.println("WU");};//枚举类的构造方法必须是private

private Week(int i){System.out.println("I");};

}

按照上面main执行,执行的都是无参的Week构造函数,因为只要用到Week枚举类,它里面的静态成员变量都会被初始化

如果非要用有参的那个构造函数那么,枚举值就必须指定参数

public enum Week{

SUN(5),MON();

private Week(){System.out.println("WU");};

private Week(int i){System.out.println("I");};

}

带有抽象方法的枚举:

public class EnumDemo {

public static void main(String[] args) {

System.out.println(Month.March.nextMonth());

}

public enum Month{

//January,February,March,April;

January(31){

public Month nextMonth() { return February;}

},February(28) {

public Month nextMonth() {return March; }

},March(30) {

public Month nextMonth() {return April; }

},April(31) {

public Month nextMonth() { return January; }

};

public abstract Month nextMonth();//抽象方法,返回类型是自己类型

private int time ;

private Month(int time){ this.time = time ;}

public String toString(){

if(this==January)return "January";

else if(this==February) return "February";

else if(this==March) return "March";

else return "April";

}

}

} 当枚举只有一个成员时,就可以作为一种单例的实现方式。

java 枚举报错_Java枚举的应用相关推荐

  1. java 枚举报错_java 枚举

    枚举: 就是要让某个类型的变量的取值只能为若干个固定值的一个,否则,编译器就会报错.枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标. 用普通类实现枚举 ...

  2. java枚举报错_java枚举类

    枚举就是要让某个类型的变量取值只能为若干个固定值中的一个,否则,编译器就会报错. 枚举可以让编译器在编译是就可以控制源程序中填写的非法值,普通变量的方式在开发阶段 例如,你定义路路灯这个对象,就只希望 ...

  3. java test报错_Java 单元测试报错

    «Java 单元测试报错:Test class should have exactly one public zero-argument constructor» public class Test{ ...

  4. 电脑配置java编译报错_java 编译错误

    我有两个简单的代码,ClickMe.java代码为:importjava.applet.Applet;importjava.awt.*;importjava.awt.event.*;publiccla ...

  5. java override报错_java @override 报错处理

    转载自:http://blog.sina.com.cn/s/blog_9c7605530101kl9r.html 一.java @override 报错处理 做项目的时候,同事那边电脑上编译通过的ja ...

  6. java package报错_Java从入门到精通(一)

    标识符 Java语言中,为各种变量.方法和类等起的名字称为标识符 Java标识符的命名规则: 应以字母.下划线.美元符开头 后跟字母.下划线.美元符或数字 Java标识符大小写敏感,长度无限制 jav ...

  7. java package报错_Java基础知识总结 - 超详细篇(上)

    1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...

  8. java sendredirect报错_java 中sendredirect()和forward()方法的区别

    HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重定向,forw ...

  9. java resourse 报错_java.nio.file.InvalidPathException: Illegal char :

    一.报错: java.nio.file.InvalidPathException: Illegal char <:>at sun.nio.fs.WindowsPathParser.norm ...

最新文章

  1. requests+正则爬取猫眼电影前100
  2. 使用 nginx 同域名下部署多个 vue 项目,并使用反向代理
  3. Py之prettytable:prettytable的简介、安装、使用方法之详细攻略
  4. ODBC驱动,没装怎么办
  5. php中可以实现多态的是继承,PHP设计模式通过继承实现多态
  6. linux下python版本升级,linux下升级python版本
  7. 关于request.getRequestDispatcher()的两个方法
  8. php mb开启,windows环境下如何为php开启mb_string函数库功能
  9. HDU 4622 求解区间字符串中的不同子串的个数
  10. 《设计模式详解》创建型模式 - 工厂模式
  11. windows安装php和mysql
  12. 如何提取明细表头_BIM/Revit常用技巧——如何添加项目参数
  13. 威纶触摸屏和台达b2伺服通讯,含程序案例资料
  14. 海康威视网络摄像头SDK中Demo的二次开发(运行)
  15. web大作业:基于html+css+javascript+jquery实现智能分控网站
  16. Self-supervised Heterogeneous Graph Neural Network with Co-contrastive Learning
  17. 基于51单片机的RFID一卡通刷卡扣费充值系统设计原理图程序设计
  18. flannel 介绍(UTP、VXLAN、Host Gateway模式详解)
  19. 卡马克在光线追踪,id tech6,射线跟踪,控制台,物理学等的谈话 第一部分
  20. Verilog HDL语言要素

热门文章

  1. Android Wallpaper之设置壁纸流程
  2. Lecture4 神经网络与反向传播(1)
  3. 计算机提升三年计划教师,教师个人发展三年工作计划3篇
  4. 操作系统重要概念——虚拟性
  5. AttributeError: 'bytes' object has no attribute '__dict__'
  6. windows程序设计读书笔记四
  7. python爬虫之获取资源----urllib,requests
  8. Java笔记——数据库05
  9. 苏宁java二面,苏宁二面面试
  10. 09-微服务版的单点登陆系统设计及实现(2105~2106)