Java枚举讲解

一、概述

1.枚举定义   

    枚举是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。

    枚举类可以有多个实例,但不是无限个数的实例,而是有限个数的实例。

所以在这里我们可以自定义实现一个简单的枚举类

public class Direction {
	//定义枚举类的实例
	public static final Direction FRONT = new Direction();
	public static final Direction RIGHT = new Direction();
	public static final Direction BACK = new Direction();
	public static final Direction LEFT = new Direction();
	
	//实现构造私有,保证不能无限的创建实例
	private Direction(){
		
	}
}

可以看出这里的构造方法必须是私有的,保证不会创建无限的实例

但是如果在枚举类中加入了变量和构造方法

public class Direction {
	//定义枚举类的实例
	public static final Direction FRONT = new Direction("前");
	public static final Direction RIGHT = new Direction("右");
	public static final Direction BACK = new Direction("后");
	public static final Direction LEFT = new Direction("左");
	
	//实现构造私有,保证不能无限的创建实例
//	private Direction(){
//		
//	}
	
	private String name;
	
	//加入成员变量,并去掉无参构造
	private Direction(String name){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
}
因为不会再使用无参构造方法,所以创建的实例也必须跟随改变
再者如果其中加入了抽象方法
        public abstract void show();

这时创建的类需要更改为抽象类,其子类实现抽象方法

public abstract class Direction {
	//定义枚举类的实例
	public static final Direction FRONT = new Direction("前"){
		@Override
		public void show(){
			System.out.println("前");
		}
	};
	public static final Direction RIGHT = new Direction("右"){
		@Override
		public void show(){
			System.out.println("右");
		}
	};
	public static final Direction BACK = new Direction("后"){
		@Override
		public void show(){
			System.out.println("后");
		}
	};
	public static final Direction LEFT = new Direction("左"){
		@Override
		public void show(){
			System.out.println("左");
		}
	};
	
	//实现构造私有,保证不能无限的创建实例
//	private Direction(){
//		
//	}
	
	private String name;
	
	//加入成员变量,并去掉无参构造
	private Direction(String name){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	
	public abstract void show();
}

而对于其测试类

public class DirectionDemo {
	public static void main(String[] args) {
		//这里其实采用了多态的向上转型
		Direction d = Direction.FRONT;
		//没有写toString方法
		System.out.println(d);//enums.Direction$1@130a7be0
		System.out.println(d.getName());//前
		d.show();//前		
	}  
}

2.用JDK5中的枚举来做枚举类

最简单的方式

public enum Directions {
	//其实现的方式跟自定义的实例是同种方式
	FRONT,BACK,LEFT,RIGHT;
}
而且测试类中
public class DirectionsDemo {
	public static void main(String[] args) {
		Directions d = Directions.FRONT;
		//其输出的并不是地址值
		System.out.println(d);//FRONT
	}
}

因为Directions类已经继承了Enum类,而这个所有枚举类的基本类中有toString方法

        public String toString()返回枚举常量的名称,它包含在声明中。  

所以这里输出的不是地址值,而且可以重写该方法,但Eclipse中的toString快速创建在这里不可用


则如果在类中添加变量和构造方法,则最简单的方式会报错,如同自定义的枚举类一样

public enum Directions {
	//其实现的方式跟自定义的实例是同种方式
	FRONT("前"),BACK("后"),LEFT("左"),RIGHT("右");
	
	private String name;
	
	private Directions(String name){
		this.name = name;
	}
	
	public String getNname(){
		return name;
	}
}

如果在枚举类中加入抽象方法

public abstract enum Directions {
	//其实现的方式跟自定义的实例是同种方式
	FRONT("前"){
		@Override
		public void show(){
			System.out.println("前");
		}
	},BACK("后"){
		@Override
		public void show(){
			System.out.println("后");
		}
	},LEFT("左"){
		@Override
		public void show(){
			System.out.println("左");
		}
	},RIGHT("右"){
		@Override
		public void show(){
			System.out.println("右");
		}
	};
	
	private String name;
	
	private Directions(String name){
		this.name = name;
	}
	
	public String getNname(){
		return name;
	}
	
	public abstract void show();
}

所以其中的实现方式和自定义的方式一致,但是枚举类在加入抽象方法后,类的声明不可以加abstract。

二、注意事项

1.所有枚举类都是Enum的子类
2.枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略
3.枚举类可以有构造器,但必须是private的,它默认的也是private的
4.枚举类也可以有抽象方法,但是枚举项必须重写该方法
5.枚举可以在switch语句中的使用

猜你喜欢

转载自blog.csdn.net/hc1151310108/article/details/80517481