enum Province{ ZHEJIANG,SHANGHAI,JIANGSU }
Province是一个最简单枚举类,它内部有三个指向它实例包括江浙沪
枚举类的特点就是它的所有实例都是在它内部生长的,并都是由编译器创建生成的
Province.values() //返回Province所有实例的数组[ZHEJIANG,SHANGHAI,JIANGSU]
其实Enum类并不存在values方法,是由编译器添加的静态方法,还有一种获得实例数组
的方法就是 Province.ZHEJIANG.getClass().getEnumConstants()
Province.SHANGHAI.ordinal() //返回SHANGHAI的序列下标 1
Province.values()[0].name() //返回ZHENGJIANG的显示名称'ZHEJIANG'
enum Province{
ZHEJIANG("浙江"),
SHANGHAI("上海"),
JIANGSU ("江苏");
private String name;
public String getDesc(){
return "地址是"+name;
}
public Province(String name){
this.name = name;
}
}
自定义枚举构造方法,在创建江浙沪3个实例时都传递了各自的中文名称作为构造参数
Province.values()[0].getDesc() //自定义方法 返回地址是浙江
注意要自定义属性或方法时必须在枚举最后一个实例后面加上';'号
为什么枚举不能继承其他类?
因为所有枚举都默认继承Enum类了,java指定一个类最多只能继承一个父类,所以枚举类
无法再显示继承其他类了,当然枚举可以实现接口.
interface Province{
enum Huadong implements Province{
ZHEJIANG,SHANGHAI;
},
enum Huanan implements Province{
GUANGDONG,JIANGXI;
},
enum Huabei implements Province{
BEIJING,TIANJING;
}
}
通过枚举实现接口的方式,将省分为华东华南华北三类,Province p = Province.Huangdong
.ZHEJIANG可以将ZHEJIANG向上转型为Province类型
Enum虽然可以很好的管理数据,但是他不能手动新增或删除实例,算不上一个容器
说到枚举特有的容器,看看下面的代码创建一个直辖市的EnumSet保存数据
EnumSet<Province> zhixiashi = EnumSet.noneOf(Province.class);
zhixiashi.addAll(EnumSet.of(Province.BEIJING,Province.TIANJING));
再看一个EnumMap的例子
EnumMap<String[]> citys = new EnumMap<String[]>(Province.class);
citys.put(Province.Huadong.ZHENGJIAN,{'杭州','宁波','绍兴'})
EnumMap的特点就是它的key都必须是枚举类型的
注:以上代码均为手敲伪代码,不保证能编译通过