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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 29198102shihao 中级黑马   /  2013-7-25 11:39  /  2307 人查看  /  2 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

枚举(        enum) 1:枚举作用:规定要使用的几个常量,而不能自己随便去定义:例如定义星期,规定是周一周二....就不能再写123了,每个人标示方式不同,会容易出错,枚举定义了一个标示的标准,在编译期就排除了这种错误,只能用我规定的那几个值,且这些值都是对象2和类定义、用法类似,是等地位的,本质是个类,可在类中定义枚举属性,一般是并列独立定义,可出现在一个文件3只要用enum定义枚举,就一定会继承java.lang.Enum类 4 enum枚举和类的最大区别:枚举编译期间就确定了所有对象,而类是要在运行期。5枚举的对象是有顺序的,按定义的顺序!5枚举和静态常量的作用类似,可以把枚举看做是静态常量字符串

用类去实现枚举:
class Weekday{
String name;
//空的私有构造方法
private Weekday(){}
//可以定义方法
public abstract void day(){};
//都是其Weekday子类对象是空对象,匿名内部类!
public final static Weekday SUN=new Weekday(){day(){return SUN}};
public final static Weekday MON=new Weekday(){day(){return MON}};
//覆盖toString,将字符串代表一个对象!
toString(){
if(this==SUN){return “SUN”;}
if(this==MON){return “MON”;}
}}

//使用枚举
class Test{
main(){
//只能使用已经规定好的成员
Weekday sun= Weekday.SUN;
print(sun.day());
}
}
定义枚举:更简单!!!成员都是对象,且有顺序!
1public enum Weekday{
//元素列表,全是枚举子类的对象,而且都是静态的,只要用到Weekday就会为他们初始化
SUN,TUS,WES,SAT相当于是枚举对象名字
SUN,TUS,WES,SAT ;      如果元素列表后面有其他方法定义,一定要加;,不然可以省略
}
2class Test{
main(){
//只能使用已经规定好的成员
Weekday sun= Weekday.SUN;
print(sun);
print(sun.name());枚举类型都有name方法,返回对象名SUN TUS等
print(sun.ordinal()); 返回元素顺序,是从0开始的
print(sun.getClass()); 得到其Class对象Weekday enum类型
枚举类型的静态方法
print(Weekday.valueOf(“sun”));枚举类型的静态方法,把一个字符串转化为枚举类型对象,字符串只能是枚举对象名
print(Weekday.values());返回一个枚举类型的所有元素对象Weekday[]
}}
例1:
main(){for(Weekday w: Weekday.values()){print(w);w.ordinal();枚举中对象的顺序!从0开始
例2:
    enum Option{TURN_LEFT,TURN_RIGHT,SHOOT}
   String s=”TURN_LEFT”;
   Option o=Option.valueOf(s);将String转化为枚举对象,s只能是Option定义的枚举对象名。

枚举的构造方法:
1public enum Weekday{
//元素列表必须放在所有方法之前,这种定义方式元素初始化时,调用其无参构造方法!!且调用4次!
SUN,TUS,WES,SAT ;
//构造方法必须是私有,目的就是只能用已有的对象
private Weekday(){}
private Weekday(int day){}   
}

1public enum Weekday{
//给元素加()和参数,可以调用指定构造方法!
SUN(1),TUS(2),WES(4),SAT(5) ;
//构造方法必须是私有,目的就是只能用已有的对象
private Weekday(int day){}   
}

抽象方法的枚举:
因为Weekday现在是抽象类,只能用其子类,而元素本身就是子类对象,只需实现抽象方法
1public enum Weekday{
//定义其子类实现抽象方法
SUN{
public Weekday nextday(){return TUS};
},
TUS{
public Weekday nextday(){ return WES };
},
WES{
public Weekday nextday(){};
};
//抽象方法
public abstract Weekday nextday(){};   
}

枚举的成员变量:

1public enum Weekday{
//调用其有参数构造方法!!
SUN(13){
public Weekday nextday){return TUS};
},
TUS(14){
public Weekday nextday){ return WES };
},
WES(15){
public Weekday nextday){};
};
//抽象方法
public abstract Weekday nextday){};  
//定义属性,每个枚举对象都拥有
private int time;
private Weekday(int time){this.time=time;}
}

如果枚举只有一个元素,就是一个单例!

eclipse新建个枚举new--enum--
例1:public enum Coin{
   penny(“HELL”),nickle(“adf”),dime(“wde”);枚举对象,对象名非别是:penny,nickle   放在一句去定义
   private String value; 枚举的属性,和类相似
   public String getValue(){return value;}枚举的方法,和类相似
   private Coin(String value){this.value=value;}枚举构造方法

   main(){ 也可以包含main方法
   Coin c=Coin.nikle;  c.getValue();} 调用枚举对象的方法}
   1编译时就确定生成了对象,相当于调用了构造方法,生成了三个对象,当没有构造方   法是可以直接penny ,nickle,dime 省略括号,有构造方法,一定要按照构造方法去生成!再写peeny就错了,因为没有无参构造方法!
   2枚举对象默认是 public final static的,可由枚举名.对象名引用

例2:public enum Color{Red,White,Blue;}
  class Test{main(){ Color c=Color.White; print(c);}}打印的是枚举对象名:White
  因此可以把枚举看做是静态常量字符串。


3 EnumSet<E extends Enum<E>>类,只接受枚举的集合;有很多静态方法对于枚举的操作
有枚举:enum Font{P,M,K}
  1 EnumSet集合对象的生成和初始化,调用of静态方法
  EnumSet <Front>set=EnumSet.of(Font.P,Font.M); 可以放一部分
  声明一个Font枚举的集合 ,并初始化
  2 EnumSet <Front>set2=EnumSet.complementOf (set);返该枚举集合的补集,即Font的其 他枚举对象组成的枚举集合。
  3 EnumSet <Front>set=EnumSet.noneOf (Font.class);创建一个空的,特定枚举的集合;
   set.add(Font.P);添加枚举Font的对象
  4.枚举集合List<Font> list=new ArrayList<Font>(); 是可以的!list.add(Font.P);
  EnumSet <Front>set=EnumSet.copyOf(list);将枚举集合copy到EnumSet里,更方便操作枚举。

4 EnumMap<E extends Enum<E>,T> 类实现了Map的接口,key必须是Enum类型:
EnumMap对象的生成:
Map<Font,String>map=new EnumMap<Font,String>(Font.class);指定特定枚举
map.put(Font.P,”rgerg”); map.put(Font.M,”merger”);
EnumMap的遍历:
for(Font f:Font.values()){ print(map.get(f));} 按照Font定义的对象的顺序输出。

5枚举应用场景:用枚举去代替静态常量
静态常量:check(int a){if(a==Constant.A){}else {return false;}}只要是整型值都可以传入参数a,会引起return false;
枚举: enum Value{M,P,N}
check(Value a){if(a==Value.M){}}限定只能传入枚举的几个对象,其他类型传不了。避免了错误的产生。
在客户端:main(){Value a=Value.valueOf(“M”);} check(a);用valueOf方法将字符串转化为枚举,传入参数。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 帖子不要一下发那么多,被认为刷帖的话,会.

查看全部评分

2 个回复

倒序浏览
挺详细的 {:soso_e179:}  顶一个
回复 使用道具 举报
写的不错,1024个赞
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马