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

时间: 2024-10-24 05:15:52

emum类(2)的相关文章

Java中emum的学习总结

一.通常的定义常量的方法 <span style="font-size:14px;">public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; }</span> 使用的时候,你可以在程序中直接引用这些常量.但是,这种方式还是存在着一些问题. 类型不安全 由于颜色常量的对应值是整数形,所以程序执行过程中很有可能给颜色变量传入一个任意的整数值,导致出现错

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

iOS -- SKSpriteNode类

SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKSpriteNode.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术

iOS -- SKScene类

SKScene类 继承自 SKEffectNode:SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKScene.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开

iOS -- SKPhysicsWorld类

SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKPhysicsWorld.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术文档.虽然已经审阅了本文档的技术准确性,但是它不是最终的版本.本机密信息仅适用于

C#嵌套类

嵌套类顾名思义就是类或者结构中定义的类 class Container { class Nested { Nested() { } } } <1>嵌套类的默认访问权限是private ,可以指定为public,protected,private,internal,protected internal.<2>嵌套类型可以访问外部类(包裹嵌套类的类),如果要访问外部类型,要把外部类通过构造函数传进一个实例<3>嵌套类中只能访问外部类中的静态成员,不能直接访问外部类的非静态成

一个实用的C#网页抓取类代码分享

一个实用的C# 网页抓取类 模拟蜘蛛,类中定义了超多的C#采集文章.网页抓取文章的基础技巧,下面分享代码: using System; using System.Data; using System.Configuration; using System.Net; using System.IO; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using Sys

类图(Rose) - Windows XP经典软件系列

最近开始了自己高级数据结构之旅,在这次旅行中,我将持续把一些高级的数据结构从理论到编码都过一遍,同时通过博客形式分享出来,希望大家指出不足之处! 二叉排序树是一种动态排序的数据结构,支持插入.删除.查找等操作,且平均时间复杂度为O(log(N)),但是普通二叉排序树不能保证树退化为一颗分支的情况,此时最坏情况下的时间复杂度为O(N).此时,平衡二叉树的产生了.平衡二叉树是一种动态调整平衡的数据结构,但理想的平衡二叉树很难,于是人们使用AVL.红黑树.Treap.伸展树等来替代平衡二叉树,这些数据

java 类对象使用

在学习反射机制时,总结一下获得类对象方式: 第一种方式:通过类本身来获得对象 Class<?> classname = this.getClass(); 或者this.class 第二种方式:通过子类的实例获取父类对象 ClassName cn = new ClassName(); UserClass = cn.getClass(); Class<?> SubUserClass = UserClass.getSuperclass(); 第三种方式:通过类名加.class获取对象 C