A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xxxqian1111 中级黑马   /  2015-3-6 18:08  /  686 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

枚举类型是j2se在1.5引入的新的类型,通过关键字enum来定义,常用来存储一些常量.

1.定义一个简单的枚举类型
Java代码  收藏代码
public enum Sex {  
    MAN,  
    WOMAN  
}  

枚举类型本质是类,编译此段代码会生成.class文件.
通过Sex.MAN来访问Sex中的成员,其返回值是Sex类型.

2.常用方法
静态的values()方法,可获取所有成员变量并以数组形式返回;从Object继承的toString()方法被重写;静态的valueOf()方法,可以尝试将指定的String类型转换为枚举类型;ordinal()方法,获取枚举成员的索引;compareTo()方法,比较两个枚举成员的顺序.
Java代码  收藏代码
public class EnumDemo2 {  
    public static void main(String[] args) {  
        for (Sex sex : Sex.values()) {  
            System.out.println(sex);  
        }  
    }  
}  

执行此段代码,可遍历输出枚举中的所有成员,运行结果:
MAN
WOMAN

3.在switch中应用
在switch中使用枚举类型,增加了程序的可读性.
Java代码  收藏代码
public class EnumDemo3 {  
    private enum Sex {  
        MAN, WOMAN  
    }  
  
    public static void showSex(Sex sex) {  
        switch (sex) {  
        case MAN:  
            System.out.println("男");  
            break;  
        case WOMAN:  
            System.out.println("女");  
            break;  
        }  
    }  
  
    public static void main(String[] args) {  
        showSex(Sex.WOMAN);  
    }  
}  

运行结果:


此段代码中showSex()方法接收的变量必须是Sex枚举类型,如果输入其他类型的变量,编译器会报告错误;如果上述switch中加入了不属于Sex中的枚举值,编译器也会报告错误.注意,此段代码中枚举声明方式与声明内部类相同,编译完成后,会产生额外的.class文件,在本例中生成的是EnumDemo3$Sex.class.

4.深入枚举类型
使用enum定义的枚举类型都是继承java.lang.Enum类,每一个成员都是枚举类型的一个实例,默认是final的,同时也是public和static的,与类中的静态常量相同,可以通过类名直接使用.
4.1.在枚举中定义属性和方法
Java代码  收藏代码
public enum Sex {  
    MAN, WOMAN;  
    public String name;  
  
    public void show() {  
        System.out.println(this.name);  
    }  
}  

注意,枚举成员必须写在最前面,否则编译出错.

4.2.构造方法
Java代码  收藏代码
public enum Sex {  
    MAN, WOMAN;  
    public String name;  
  
    private Sex() {  
  
    }  
  
    private Sex(String name) {  
        this.name = name;  
    }  
}  

枚举类型的构造方法必须是私有的,可以形成重载;如果枚举中只含有一个成员,则与单例模式相似.

4.3.成员匿名类
每一个成员可以调用构造方法,定义属性和方法(暂时不知有何用处),重写枚举中的方法.
Java代码  收藏代码
public enum Sex {  
    MAN() {  
        public void show() {  
            System.out.println("man");  
        }  
    },  
    WOMAN("name") {  
        public int age;  
  
        public void test() {  
  
        }  
    };  
  
    private Sex() {  
  
    }  
  
    private Sex(String name) {  
    }  
  
    public void show() {  
        System.out.println("sex");  
    }  
}  
  
public class EnumDemo4 {  
    public static void main(String[] args) {  
        for (Sex sex : Sex.values()) {  
            sex.show();  
        }  
    }  
}  

编译完成后,会生成Sex$1.class和Sex$2.class文件,运行结果:
man
sex

5.实现接口
由于枚举已经继承Enum类,不能在继承其他类,但可以实现接口.
Java代码  收藏代码
public interface I {  
    void i();  
}  
  
public enum Sex implements I {  
    MAN() {  
        public void i() {  
            System.out.println("man");  
        }  
    },  
    WOMAN() {  
    };  
  
    public void i() {  
        System.out.println("sex");  
    }  
}  
  
public class EnumDemo5 {  
    public static void main(String[] args) {  
        for (Sex sex : Sex.values()) {  
            sex.i();  
        }  
    }  
}  

运行结果:
man
sex

6.在集合中使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合.
EnumSet保证元素不重复;EnumMap中的key值是Enum类型,value值可以使任意类型.

小结:枚举类型与接口类型类似,是特殊的类,用来存储一些常量的集合.在switch中应用可提高程序的可读性.所有的枚举类型都继承自Enum类,可以有私有的构造方法以及属性和方法.可以实现接口,也可以在集合中应用.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马