1.什么是枚举

枚举是jdk1.5后才增加的新特性

用枚举就是要规定一个新的类型,那么要用这个类型的值就必须是我规定的那些值。如果不是那些值,编译器就会报错,好处是编译时就会做出判断

2.用普通类模拟枚举的实现原理

  

package com.java.javaenhance1;
/**
* 用普通的java类,来实现枚举的原理
* 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象
* @author Administrator
*
*/
public class WeekDay { private WeekDay() {
} public final static WeekDay SUN = new WeekDay();
public final static WeekDay MON = new WeekDay(); public WeekDay nextDay() {
if (this == SUN) {
return MON;
} else {
return SUN;
}
} public String toString() {
return this == SUN ? "SUN" : "MON";
} }
package com.java.javaenhance1;

public class EnumTest {

    public static void main(String[] args) {

        WeekDay weekDay = WeekDay.SUN;
System.out.println(weekDay.nextDay()); //MON
System.out.println(weekDay.toString()); //SUN
} }

这里还可以使用抽象方法的方式实现nextDay(),就将大量的if.else语句转义成了一个个独立的类。

package com.java.javaenhance1;
/**
* 用普通的java类,来实现枚举的原理
* 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象
* @author Administrator
*
*/
public abstract class WeekDay { private WeekDay() {
} //带一个{} 表示匿名子类
public final static WeekDay SUN = new WeekDay(){ @Override
public WeekDay nextDay() {
return MON;
}
};
public final static WeekDay MON = new WeekDay(){ @Override
public WeekDay nextDay() {
return SUN;
}
}; //还可以使用抽象类的方式,各自实现nextDay()
/*public WeekDay nextDay() {
if (this == SUN) {
return MON;
} else {
return SUN;
}
}*/
//nextDay分别有子类去完成
public abstract WeekDay nextDay(); public String toString() {
return this == SUN ? "SUN" : "MON";
} }

3.java5的枚举的基本应用

package com.java.javaenhance1;

public class EnumTest {

    public static void main(String[] args) {

WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2); //FRI 枚举自己实现了toString()
System.out.println(weekDay2.name());//FRI
System.out.println(weekDay2.ordinal()); //5 元素中排第几,第一个从0开始
//把一个字符串变成一个对象的枚举元素
System.out.println(WeekDay.valueOf("SUN")); //SUN
//把枚举中的所有元素装进数组里,可用于遍历
System.out.println(WeekDay.values().length); //

} /**
* 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象
* @author Administrator
*
*/
public enum WeekDay{
SUN,MON,TUE,WED,THI,FRI,SAT
} }

4.实现带有构造方法的枚举(带有参数的构造方法)

/**
* 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象
* @author Administrator
*
*/
public enum WeekDay{
SUN(1),MON,TUE,WED,THI,FRI,SAT; //定义的所有其他信息必须位于元素之后
private WeekDay(){System.out.println("first");} //构造方法必须是private类型的
private WeekDay(int day){System.out.println("second");}
}

在枚举元素的后边跟上一个括号,()中的参数代表元素初始化时用的哪个构造方法,如果没有(),表示调用默认空参构造器

5.实现带有抽象方法的枚举

内部类前边可以有4中访问修饰符,外部类只有两种,public和默认

带有抽象方法的枚举,元素需要实现抽象的方法,使用RED{} 匿名子类的方式

RED(30) 表示构造实例对象时用的是哪个构造方法

public enum TrafficLamp{
RED(30){ //使用内部类方式实现抽象类
@Override
public TrafficLamp nextLamp() {
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
return YELLOW;
}
},
YELLOW(5){
@Override
public TrafficLamp nextLamp() {
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time = time;}
}

 经过编译后,会自动生成子类的 .class文件

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

如果要写一个单例,就可以写一个枚举,只有一个元素。

java高新技术-枚举的更多相关文章

  1. Java核心 --- 枚举

    Java核心 --- 枚举 枚举把显示的变量与逻辑的数字绑定在一起在编译的时候,就会发现数据不合法也起到了使程序更加易读,规范代码的作用 一.用普通类的方式实现枚举 新建一个终态类Season,把构造 ...

  2. Java高新技术 注解

      Java高新技术 注解 知识概要:                  (1)了解注解 (2)注解的应用结构图 (3)@Retention(RetentionPolicy.RUNTIME)    ...

  3. Java高新技术 反射机制

     Java高新技术 反射机制 知识概要:                   (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...

  4. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)

    写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...

  5. Java高新技术 JavaBean内省

     Java高新技术  JavaBean内省 知识概要:                 (1)了解JavaBean内省                 (2)JavaBean的简单内省操作     ...

  6. Java高新技术 JDK1.5之新特性

      Java高新技术  JDK1.5的新特性 知识概要:                 (1)静态导入 (2)可变参数 (3)增强for循环 (4)基本数据类型的自动拆箱和装箱 静态导入     ...

  7. Java高新技术 Myeclipse 介绍

      Java高新技术   Myeclipse 介绍 知识概述:              (1)Myeclipse开发工具介绍 (2)Myeclipse常用开发步骤详解               ...

  8. java的枚举2

    首先先理解一下java中枚举的本质. java的世界中一切皆是类,下面通过一个例子解释一下enum的本质: package cn.xnchall.enumeration; public class G ...

  9. Java开发知识之Java的枚举

    Java开发知识之Java的枚举 一丶什么是枚举 枚举可以理解为就是常量,在Java中我们定义常量.都是用 final语句. C++中都是用const关键字. 枚举跟C++概念都是一样的.就是特定的常 ...

随机推荐

  1. SQL Server 2012 安装图解教程

    在安装微软最新数据库SQL Server 2012之前,编者先确定一下安装环境:Windonws 7 SP1,32位操作系统.CPU是2.1GHz赛扬双核T3500,内存2.93GB 安装SQL Se ...

  2. 设计模式C#实现(十三)——享元模式(蝇量模式)

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 当以下情况都成立时使用: 一个程序使用了大量的对象 完全由于使用大量对象造成很大存 ...

  3. 【转】Java并发编程注意事项

    保证线程安全的三种方法: 不要跨线程访问共享变量 使共享变量是final类型的 将共享变量的操作加上同步 一开始就将类设计成线程安全的, 比在后期重新修复它,更容易. 编写多线程程序, 首先保证它是正 ...

  4. Xamarin.Android VSTS 持续集成

    这些天做了一个基于 VSTS 的 Xamarin.Android的持续集成,这里分享下 Build Agent 环境需求 DotNetFramework msbuild visualstudio An ...

  5. MVC架构学习之EasyFirst——快点夸我爱学习~

    iMooc上的MVC教程练习. MVC是PHP基础和进阶的分界点吧应该说是 一.准备 工欲善其事~ 个人环境:windows10+wamp2.5+ZendStudio12: 项目名称:MVCEasyF ...

  6. 阅读Real-Time O(1) Bilateral Filtering 一文的相关感受。

    研究双边滤波有很长一段时间了,最近看了一篇Real-Time O(1) Bilateral Filtering的论文,标题很吸引人,就研读了一番,经过几天的攻读,基本已理解其思想,现将这一过程做一简单 ...

  7. 【2016-11-2】【坚持学习】【Day17】【通过反射自动将datareader转为实体info】

    通过ADO.net 查询到数据库的数据后,通过DataReader转为对象Info public class BaseInfo { /// <summary> /// 填充实体 /// & ...

  8. CSS/CSS3常用样式小结

    1.强制文本单行显示: white-space:nowrap; 多行文本最后省略号: display: -webkit-box; -webkit-line-clamp:2; overflow: hid ...

  9. NOI2001|POJ1182食物链[种类并查集 向量]

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65430   Accepted: 19283 Description ...

  10. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 多软件系统集成缓存体系改进

    由于我们同时开发多个大型应用系统同时系统有大量用户.高并发用户,平时访问系统的用户数量就有3万多人在线.需要对几十个系统进行持续优化改进,同时要增强信息系统的各种安全性. 如此多的系统.如此多的用户, ...