枚举
- 枚举在C/C++/c#,还有Objective-C中,是一个被命名的整型常数的集合,枚举在日常生活中很常见。例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是一个枚举。
- 在应用程序开发中,经常涉一个变量的取值范围为一组固定的常量的集合。例如:字体的大小、线条的样式等。为此,java语言引入了枚举类型。
例如:声明一个名为Size的枚举类型,该枚举类型具有三个枚举值;SMALL、MEDIUM和LARGE.
enum Size{
SMALL,
MEDIUM,
LARGE;
}
声明枚举其实就是定义一种特殊形式的类,但不能通过关键字new创建其对象实例。枚举类型的枚举值是(SMALL,MEDIUM,LARGE)是Size的类对象实例。
例如:Size size = Size.SMALL;
- 枚举成员默认都是public static final的,即常量。因此,按命名规则,枚举类中的枚举值全部大写。
- java类库中提供了大量的枚举类型。使用枚举类型,可以限制取值范围有限、固定的一组命名常量,提高编程效率,并降低程序出错的几率。
枚举的声明和使用
1、简单枚举的声明和使用
Java使用关键字enum声明枚举。
【枚举修饰符】enum枚举名{
枚举体【;】
}【;】
2、枚举规范
(1)【枚举修饰符】(可选):枚举声明的修饰同样的意义,符与类声明的修饰符具有同样的意义。在枚举声明中,只允许public,不允许abstract和final修饰符,枚举不能是抽象的,也不允许派生。
(2) enum:关键字,注意首字母小写;
(3)枚举名:所要定义的枚举的标识符,必须符合标识符的命名规则,一般采用PascalCase命名规范,例如:WeekDays.
(4)枚举体:用于定义零个或多个枚举值,枚举值以英文逗号分隔。这些枚举值是该枚举类型的对象实例,任意两个枚举值不能有相同的名字。
例如:
enum MyColor{
RED,GREEN,BIUE;
}
- 访问枚举的方式与访问静态常量字段类似,其基本类型为:
“ 枚举名,枚举成员”
例如:
Mycolor color = Mycolor.RED;
- 枚举值可以直接使用操作符(==)进行比较。
例如:
Mycolor color1= Mycolor.BIUE;
if(color1 == Mycolor.RED){
System.out.println("color1 is red");
}else{
System.out.println("color1 is not red");
}
- 枚举值可以用于switch…case语句,枚举是一个抽象类。
例如:
Mycolor color2 = Mycolor.RED;
switch(color2){
case RED:
System.out.println("color2 is red");break;
case GREEN:
System.out.println("color2 is green);break;
case BIUE:
System.out.println("color2 is blue);break;
}
示例一
enum MyColor{
RED,GREEN,BIUE;
}
public class EnumTest1{
public static void main(String[] args){
Mycolor color1 = Mycolor.BIUE;
if(color1 == Mycolor.RED){
System.out.println("color1 is red");
}else{
System.out.println("color1 is not red");
}
Mycolor color2 = Mycolor.RED;
switch(color2){
case RED:
System.out.println("color2 is red");break;
case GREEN:
System.out.println("color2 is green);break;
case BIUE:
System.out.println("color2 is blue);break;
}
}
运行结果:
color1 is not blue
color2 is red
3、声明枚举类型的其他成员
在枚举类型中,除了声明枚举值之外,还可以声明其他类成员,包括构造方法、方法和数据成员。
注意:枚举类的构造方法与一般类的构造方法不同,枚举类构造方法的访问修饰符只能为private(声明时可以省略private,因为默认的就是private),构造方法只是在构造枚举值得时候被调用。
- 枚举不可以产生实例对象 new 原因:自定义的枚举,都是继承 enum
enum Mycolor2{ //枚举类
RED(255,0,0),GREEN(0,225,0),BIUE(0,0,225);
//私有构造方法,用于构造枚举值,例如RED(225,0,0)
private Mycolor(int rv, int gv, int bv){ //枚举类型的构造方法为private
this.redValue = rv;
this.greenValue = gv;
this.biueValue = bv;
}
public String toString(){
return super.toString() + "(" + redValue + " , " + greenValue + " , " + biueValue + " ) ";
}
//成员变量
private int redValue ;
private int greenValue ;
private int biueValue;
}
public class EnumTest {
public static void main(String[] args) {
//Color color1 = new Color(); //编译错误:不能使用new关键字创建枚举类的对象实例
Mycolor2 color = Mycolor.BIUE;
System.out.println(color); //隐式调用toString()方法
System.out.println(color.toString()); //调用toString()方法
}
}
运行结果:
BIUE(0,0,225)
BIUE(0,0,225)
- 在上述示例中,枚举类型Color声明了三个private成员变量,一个私有构造方法,重写了从基类继承的成员方法toString().
枚举类的成员方法
所有的枚举类型都隐式的继承于Enum类(java.lang.Enum),故所有枚举类都继承了Enum类的方法。声明枚举类型时,编译器会自动提供相应方法的实现。
假设 Colors为一下的枚举类型:
enum MyColors{
RED,GREEN,BIUE;
}
Mycolors color1 = Mycolors.RED;
1、int ordinal()
- 返回枚举常量的序数(在枚举声明中的位置,其中初始常量序数为零),相当于下标
enum Color{
RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
public static void main(String[] args) {
Color color = Color.BLACK;
Color color2 = Color.RED;
System.out.println(color.ordinal());
}
}
运行结果:
3
2、int compareTo(E o)
- 比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。枚举常量只能与枚举类型的其他枚举常量进行比较,否则会产生编译错误。
enum Color{
RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
public static void main(String[] args) {
Color color = Color.BLACK;
Color color2 = Color.RED;
System.out.println(color2.compareTo(color));
//值和地址都不同
System.out.println(color1.equals(color2)); //false
System.out.println(color1 == color2); //false
}
}
运行结果:
-3
3、String name()
- 返回次枚举常量的名称
enum Color{
RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
public static void main(String[] args) {
Color color = Color.BLACK;
Color color2 = Color.RED;
System.out.println(color.name());
}
}
运行结果:
BLACK
4、String toString()
- 返回枚举常量的名称
enum Color{
RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
public static void main(String[] args) {
Color color = Color.BLACK;
Color color2 = Color.RED;
System.out.println(color.toString());
System.out.println(color); //隐式调用String toString()方法
}
}
运行结果:
BLACK
BLACK
5、valueOf
- 返回带指定名称的指定枚举类型的枚举常量。可以重写此方法
enum Color{
RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
public static void main(String[] args) {
Color color = Color.BLACK;
Color color2 = Color.RED;
System.out.println(Color.valueOf("BLACK"));
//重写valueOf()方法
Color color3 = Color.valueOf("BLACK");
System.out.println(color3);
}
}
运行结果:
BLACK
BLACK
6、values()
- 返回一个该枚举类的数组,其中数组的元素即为该枚举元素列表中的元素。
== values()是编译器创造的静态方法==
enum Color{
RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
public static void main(String[] args) {
Color color = Color.BLACK;
Color color2 = Color.RED;
Color[] colors = Color.values();
for (int i = 0; i < colors.length; i++) {
System.out.println(colors[i]);
}
}
}
运行结果:
RED
GREEN
WHITE
BLACK
enum Color{
RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
public static void main(String[] args) {
Color color = Color.BLACK;
Color color2 = Color.RED;
for (Color c : Color.values()) {
System.out.println(c + ",");
}
for (Color c : Color.values()) {
System.out.print(c);
}
}
}
运行结果:RED,GREEN,WHITE,BLACK,RED
GREEN
WHITE
BLACK
RED
7、得到这个类名
enum Color{
RED,GREEN,WHITE,BLACK
}
public class TestDemo1 {
public static void main(String[] args) {
Color color = Color.BLACK;
Color color2 = Color.RED;
System.out.println(color.getDeclaringClass());
}
}
运行结果:
class Color