黑马程序员技术交流社区
标题:
关于枚举的疑问
[打印本页]
作者:
任亚俊
时间:
2013-12-24 03:32
标题:
关于枚举的疑问
昨天看了张老师的交通灯管理系统,对枚举不是很理解。
1.枚举中可以有构造方法,可以有普通方法,枚举与类的关系是什么呢?
2.枚举和类有啥区别呢?
3.什么时候用枚举比类好呢?
作者:
刘安成
时间:
2013-12-24 05:13
枚举类型其实就是一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class或interface.
当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。
枚举类型既然是类,那么也就可以有构造函数。只不过不得有公开(Public)的构造函数,这是为了避免直接对枚举类型实例化
作者:
卖火柴
时间:
2013-12-24 08:47
参考资料:
Java的枚举的基本应用(枚举的入门)
Public enum WeekDay{
SUN,MON,THE,WED,THU,FRI,SAT
}
枚举相当于一个类,而枚举类的一个值相当于该类的一个实例对象
如,可以把WeekDay看成一个类,SUN就是WeekDay的一个实体对象了。
枚举的方法:
WeekDay weekday = WeekDay.SUN;
weekday.name();//获取当前枚举对象的名称 ——SUN
weekday.ordinal();//获取当前对象在枚举中的序列,从0开始
WeekDay.valueOf(“FRI”); //把一个字符串转换为一个枚举的对象
WeekDay.valuds(); //获得枚举中所有的对象的值,返回一个数组,输出如下
for(WeekDay day:WeekDay.values()){
System.out.println(day);
}
实现带有构造方法的枚举
publc enum WeekDay{
SUN,MON(5),THE,WED,THU,FRI,SAT;
private WeekDay();
private WeekDay(int day);
}
构造方法必须是私有的,且放在所有枚举元素的后面。构造方法可带参数。
实现带有抽象方法的枚举
public enum TrafficLamp{
RED(30){ //子类调用父类带有一个参数的构造方法
public TrafficLamp nextLamp() {
//为了创建TrafficLamp的实例对象指向RED,先实现TrafficLamp的抽象方法。
return GREEN;
}},
GREEN(50){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp(); //抽象方法
private int time;
private TrafficLamp(int time){this.time = time;}
}
//枚举交通灯TrafficLamp 的元素实例有3个:RED,GREEN,YELLOW.
//当枚举中只有一个元素的时候,它是单例模式。
作者:
恨死我了
时间:
2013-12-24 10:07
public class TestEnum {
/*最普通的枚举*/
public enum ColorSelect {
red, green, yellow, blue;
}
/* 枚举也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样. */
public enum Season {
// 枚举列表必须写在最前面,否则编译出错
winter, spring, summer, fall;
private final static String location = "Phoenix";
public static Season getBest() {
if (location.equals("Phoenix"))
return winter;
else
return summer;
}
}
/*还可以有构造方法*/
public enum Temp {
/*通过括号赋值,而且必须有带参构造器和一属性跟方法,否则编译出错
* 赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值
* 如果不赋值则不能写构造器,赋值编译也出错*/
absoluteZero(-459), freezing(32),boiling(212), paperBurns(451);
private final int value;
public int getValue() {
return value;
}
//构造器默认也只能是private, 从而保证构造函数只能在内部使用
Temp(int value) {
this.value = value;
}
}
public static void main(String[] args) {
/*
* 枚举类型是一种类型,用于定义变量,以限制变量的赋值 赋值时通过"枚举名.值"来取得相关枚举中的值
*/
ColorSelect m = ColorSelect.blue;
switch (m) {
/*注意:枚举重写了ToString(),说以枚举变量的值是不带前缀的
*所以为blue而非ColorSelect.blue
*/
case red:
System.out.println("color is red");
break;
case green:
System.out.println("color is green");
break;
case yellow:
System.out.println("color is yellow");
break;
case blue:
System.out.println("color is blue");
break;
}
System.out.println("遍历ColorSelect中的值");
/*通过values()获得枚举值的数组*/
for (ColorSelect c : ColorSelect.values()) {
System.out.println(c);
}
System.out.println("枚举ColorSelect中的值有:"+ColorSelect.values().length+"个");
/*ordinal()返回枚举值在枚举中的索引位置,从0开始*/
System.out.println(ColorSelect.red.ordinal());//0
System.out.println(ColorSelect.green.ordinal());//1
System.out.println(ColorSelect.yellow.ordinal());//2
System.out.println(ColorSelect.blue.ordinal());//3
/*枚举默认实现了java.lang.Comparable接口*/
System.out.println(ColorSelect.red.compareTo(ColorSelect.green));
System.out.println(Season.getBest());
for(Temp t:Temp.values()){
/*通过getValue()取得相关枚举的值*/
System.out.println(t+"的值是"+t.getValue());
}
}
}
复制代码
作者:
恩恩
时间:
2013-12-25 12:05
其实枚举就是一个类,只不过在这里里面定义了很多的他自己的东西,当你需要使用枚举的时候,你就直接用它里面的东西就可以了,或者自己在定义一个枚举的时候自己定义一些东西,然后用的时候,就只能用这个里面。
类里面可以有构造方法,那么枚举里面当然也是如此了,但是不能对原来的枚举类直接操作,所以定义为了private类型,这样是保护里面的数据不被修改。
作者:
木木赤赤
时间:
2013-12-27 10:28
Enum
作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接
口。当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类
型的非枚举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。
4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己
重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里
Color.Red.ordinal()返回0。
1.遍历所有有枚举值
知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
for (Color c: Color.values()) System.out.println(“find value:” + c);
2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2