emum类(2)
emum定义如下:
public abstract class Enum<E extends Enum<E>>extends Objectimplements Comparable<E>, Serializable
此类定义使用了泛型接口,而且实现了Comparable接口和Serializable接口,证明了此类型是可以被比较和序列化的。
构造方法:
protected Enum(String name, int ordinal) 单独的构造方法。
emun构造方法,中接收的两个参数,一个表示枚举的名字(name()),另一个表示枚举的序号ordinal()。
public enum Color{
RED,GREEN,BLUE ;
}
Red实际上就是枚举的名称,默认的编号是0.
例子:
package 类集;
enum color1
{ red,black,green
}
public class test1{
public static void main(String args[]){
for(color1 c:color1.values()){
System.out.println(c.ordinal() + " --> " + c.name()) ;
}
}
}
结果:
0 --> red
1 --> black
2 --> green
如果此时希望做点改进,希望使用文字表示 颜色的信息,则可以按照color类形式,在枚举类中定义属性(也就是name)和构造方法,
但是一旦声明有参数构造之后,在声明枚举对象的时候就必须明确地调用构造方法,并传递参数。
如下:
package 类集;
enum Color{
RED("红色"),GREEN("绿色"),BLUE("兰色") ; //明确地调用构造方法,并且传递参数。
private Color(String name){
this.setName(name) ;
}
private String name ; // 定义name属性
public void setName(String name){
this.name = name ;
}
public String getName(){
return this.name ;
}
}
public class test1{
public static void main(String args[]){
for(Color c:Color.values()){
System.out.println(c.ordinal() + " --> " + c.name()
+"(" + c.getName() + ")") ;
}
}
}
返回结果:
0 --> RED(红色)
1 --> GREEN(绿色)
2 --> BLUE(兰色)
如果现在不想通过构造方法设置内容,而想通过getter(),setter()方法设置内容,则必须按照如下方式进行。
package 类集;
enum Color{
RED,GREEN,BLUE ;
private String name ; // 定义name属性
public void setName(String name){
switch(this){ // 判断操作的是那个枚举对象
case RED:{
if("红色".equals(name)){ //必须还得判断设置的内容是否合格。
this.name = name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break ;
}
case GREEN:{
if("绿色".equals(name)){
this.name = name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break ;
}
case BLUE:{
if("蓝色".equals(name)){
this.name = name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break ;
}
}
this.name = name ;
}
public String getName(){
return this.name ;
}
}
public class test1{
public static void main(String args[]){
Color c = Color.BLUE ; // 得到兰色
c.setName("兰色") ; // 名字错误
c.setName("蓝色") ; // 名字正确
System.out.println(c.getName()) ;
}
}
输出结果:
设置内容错误。
蓝色
以上发现通过构造方法更简便一些。
通过valueof()方法,指定枚举名称来得到枚举常量
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。
可以把上面那段代码主方法里的第一句话给替换掉。如下。
package 类集;
enum Color{
RED,GREEN,BLUE ;
private String name ; // 定义name属性
public void setName(String name){
switch(this){ // 判断操作的是那个枚举对象
case RED:{
if("红色".equals(name)){
this.name = name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break ;
}
case GREEN:{
if("绿色".equals(name)){
this.name = name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break ;
}
case BLUE:{
if("蓝色".equals(name)){
this.name = name ; // 允许设置名字
}else{
System.out.println("设置内容错误。") ;
}
break ;
}
}
this.name = name ;
}
public String getName(){
return this.name ;
}
}
public class test1{
public static void main(String args[]){
Color c = Color.valueOf(Color.class,"BLUE") ; // 得到兰色
c.setName("兰色") ; // 名字错误
c.setName("蓝色") ; // 名字正确
System.out.println(c.getName()) ;
}
}
对于枚举.Class是java中反射机制内容。
枚举中实际上已经实现了comparable接口,所以枚举中内容是可以排序的。
package 类集;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet; enum Color{
RED,GREEN,BLUE ;
}
public class test1{
public static void main(String args[]){
Set<Color> t = new TreeSet<Color>() ; // 设置类型
t.add(Color.GREEN) ; // 加入绿色
t.add(Color.RED) ; // 加入红色
t.add(Color.BLUE) ; // 加入蓝色
Iterator<Color> iter = t.iterator() ;
while(iter.hasNext()){
System.out.print(iter.next() + "、") ;
}
}
}
输出,
RED、GREEN、BLUE、
可以发现,加入TreeSet的时候是无序的,输出的时候是有序的。
通过TreeSet
emum类(2)的更多相关文章
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- 使用枚举(emum)代替常量类
原文: 作者:逍遥不羁 来源:CSDN 原文:https://blog.csdn.net/javaloveiphone/article/details/52371706 版权声明:本文为博主原创文章, ...
- UE4 中Struct Emum 类型的定义方式 笔记
UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...
- 《Java核心技术》 -- 读书笔记 ② - 类 | 对象 | 接口
对象vs对象变量 “对象” 描述的是一个类的具体实例,他被java虚拟机分配在 "堆" (Heap)中. “对象变量” 为一个对象的引用(对象变量的值=记载着具体对象的位置/地址) ...
- C++ 可配置的类工厂
项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
随机推荐
- Mac下导出chrome插件
chrome最强大的功能之一就是插件,有时候需要给小伙伴们共享一些插件,所以需要将自己chrome中的插件打包,在mac下打包插件还是挺费劲的,在此记录. 打开chrome的扩展程序,找到要导出的插件 ...
- http的响应对象
Servlet 服务器 HTTP 响应 正如前面的章节中讨论的那样,当一个 Web 服务器响应一个 HTTP 请求时,响应通常包括一个状态行.一些响应报头.一个空行和文档.一个典型的响应如下所示: H ...
- 2016年 Delphi Roadmap
2016年delphi Roadmap 发布,这也是新公司的第一次发布路线图. 虽然稍微晚点( 原来说是1月份发布路线图),至少比过去积极点.喧嚣多年的靴子终于落地. Linux 的支持终于正式公布. ...
- bash脚本编程之二 字符串测试及for循环
shell中大量的测试和比较选项而困惑呢? 这个技巧可以帮助您解密不同类型的文件.算术和字符串测试,这样您就能够知道什么时候使用 test. [ ]. [[ ]].(( )) 或 if-then-el ...
- Linux内核分析第六周学习总结:进程的描述和进程的创建
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 ...
- asp.net GDI+ 使用PathGradienBrush类实现彩色渐变
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 如何创建多个Memcached服务
在学习Memcached时,为了模拟分布存储,常常需要建多个Memcached服务,如何建呢,只能使用命令行了 运行cmd,输入如下命令 sc create "Memcached Serve ...
- [转] 在Linux平台使用mhVTL虚拟化磁带库
原文来自:LIUBINGLIN ---- http://blog.itpub.net/23135684/viewspace-1307626/ <在Linux平台安装mhVTL虚拟化磁带库> ...
- select与poll函数介绍
select与poll函数介绍 在所有依从POSIX的平台上,select函数使我们可以执行I/O多路转接.传向select的参数告诉内核: 1)我们所关心的描述符 2)对于每个描述符我们所关心的状态 ...
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
[前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...