黑马程序员技术交流社区
标题:
关于枚举??
[打印本页]
作者:
张学东
时间:
2012-10-26 16:52
标题:
关于枚举??
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
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;
}
}
}
复制代码
谁能帮我解释下这段代码啊
作者:
张忠豹
时间:
2012-10-26 17:34
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
RED这是一个枚举子对象,调用了父类型的有参数的构造方法,而且还实现了父类型的abstract方法。
枚举这玩意特殊,反正记着就行。
作者:
齐连涛
时间:
2012-10-26 17:58
枚举中每个元素都是该类的实例对象,该例中RED,GREEN,YELLOW都是该枚举类的对象,它们后面的(){}中内容是复写了构造方法,在类内部创建本类对象,所以每个元素都是该类对象
作者:
赵红萍
时间:
2012-10-26 21:32
这个解释起来比较复杂,先从一个简单的入手,要认真看
使用枚举是为了在项目中别人用到我自己写的一个类的对象时,只能使用我规定的那些值,避免发生错误.
一先用一个普通类模拟枚举(以星期类WeekDay为例)
1先创建一个普通类WeekDay
public class WeekDay{
private WeekDay(){} //构造函数一定要是私有的
pvirate final static WeekDay SUN = new WeekDay();
pvirate final static WeekDay MON= new WeekDay();
//因为时间问题,就写了两个
//因为WeekDay是自己定义的一个类,所以要打印时,就要覆盖toString()
public String toString(){
}
}
2在包含主函数的类中使用WeekDay
public class TestEnum{
public static void main(String args[]){
WeekDay weekday = WeekDay.MON;
//这样在main函数中使用weekday时,只能使用我定义好的那几个静态的值
}
}
以上是用普通的类来实现枚举,从这就可以看出枚举中的元素其实都是一个此类型的对象.
二用关键字enum来创建枚举
public class TestEnum{
public static void main(String args[]){
WeekDay weekday = WeekDay.SUN;
}
//使用enum关键字创建枚举
public enum WeekDay{
SUN,MON,TUE,WED,THI,FIR,SAT;//分号可以写可以不写
}
}
使用jdk写好枚举比我们自己写的要省事,并且还有一些方法供我们使用.
三枚举类型的深入解析
1在枚举中定义构造函数//从这要认真看,那个交通灯的例子用到了这种思想
public class TestEnum {
public static void main(String[] args) {
Weekday weekday = Weekday.FIR;
System.out.println(weekday);
}
public enum Weekday
{
SUN,MON,TUE,WED,THI,FIR,SAT;//在枚举中有其他方法时,分号必须写
private Weekday()//枚举的构造方法必须是私有的,并且写在元素的后面
{
System.out.println("first");
}
private Weekday(int day)
{
System.out.println("second");
}
}
}
当程序执行时可以看到,枚举在实例化时用到的是没有参数的构造函数;如果想要使用带参数的构造函数就要修改枚举类型:
public enum Weekday
{
SUN(1),MON(),TUE,WED,THI,FIR,SAT;
}
这样在SUN实例化时就会使用带参数的构造函数,虽然MON带了括号,但是实例化时还是用的是不带参数的构造函数.
对于交通灯的那个例子,
RED(30){
03. public TrafficLamp nextLamp(){
04. return GREEN;
05. }
RED(30)中RED是枚举TrafficLamp的一个子类对象,并用RED来表示此子类对象,它调用的是带参数的构造函数,因为RED,GREEN,YELLOW都是枚举TrafficLamp创建的子类对象,所以子类必须重写父类中的抽象方法
作者:
zdf091119
时间:
2012-10-26 21:40
这里枚举有三个元素:RED、GREEN、YELLOW ,
元素括号里的是构造函数的参数,他调用了构造函数TrafficLamp(int time)
花括号里面的是实现类中的抽象函数:nextLamp,返回的是TrafficLamp类型
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2