黑马程序员:枚举



枚举:

为什么要有枚举:

问题:要定义星期几或性别的变量。该怎么定义?

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制程序中填写的非法值,普通变量的方式在开发阶段是无法实现这一目标的。

用普通类如何实现枚举功能?定义一个weekday的类来模拟枚举功能:

1.私有的构造方法

2.每个元素分别用一个共有的静态成员变量表示

3.可以有若干个共有的方法或抽象方法

package day1;

//用普通类如何实现枚举功能?

 

public abstract class WeekDay {

//1.私有构造方法

private WeekDay(){}

//2.每个元素用分别用一个公有的静态成员变量表示

public static final WeekDay MON = new WeekDay() {

@Override

public WeekDay nextDay() {

// TODO 自动生成的方法存根

return SUN;

}

};

public static final WeekDay SUN = new WeekDay(){

@Override

public WeekDay nextDay() {

// TODO 自动生成的方法存根

return MON;

}

};

//4.用抽象方法,所以WeekDay也要用abstract修饰

public abstract WeekDay nextDay();//抽象方法不能方法实体,即后面不能加大括号

//3.可以有若干个公有的方法或抽象方法

/* public WeekDay nextDay(){

if(this == MON){

return SUN;

}

else{

return MON;

}

}*/

public String toString(){

return this==SUN?"SUN":"MON";

}

}

1.成员列表必须在第一行,如果后面还有代码,最后要加分号

package day1;

//简单的枚举

public class EnumTest1 {

 

public static void main(String[] args) {

WeekDay weekDay = WeekDay.FRI;

System.out.println(weekDay);

System.out.println(weekDay.name());

System.out.println(weekDay.ordinal());

System.out.println(WeekDay.valueOf("SUN").toString());

System.out.println(WeekDay.values().length);

}

//枚举是特殊的类.1.可以卸载一个类里面2.因为是个类,所以没有()3.如果枚举中有抽象方法,也不需要在枚举上用abstract修饰

public enum WeekDay{

//1.简单的枚举

// SUN,MON,TUE,WEN,THU,FRI,SAT

//2.带构造方法的枚举

SUN(1),MON(),TUE,WEN,THU,FRI,SAT;

private WeekDay(){System.out.println("first");};

private WeekDay(int day){System.out.println("second");};

}

//最复杂的枚举,掌握这个就足够了

public enum TrafficLamp{

//3.带抽象方法的枚举

RED(30){

public TrafficLamp nextLamp(){

return GREEN;

}

},YELLOW(3){

public TrafficLamp nextLamp(){

return RED;

}

},GREEN(20){

public TrafficLamp nextLamp(){

return YELLOW;

}

};

private TrafficLamp(){};

private TrafficLamp(int seconds){};

public abstract TrafficLamp nextLamp();

}

}

总结:

枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。

枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。

带构造方法的枚举:

构造方法必须定义成私有的

如果有多个构造方法,该如何选择构造方法?

枚举元素MON和MOM()的效果一样,都是调用默认的构造方法。

带有方法的枚举:

定义枚举TrafficLamp

实现普通的next方法

实现抽象的next方法:每个元素分别是由枚举的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。

增加上表示时间的构造方法。

枚举只有一个成员时,就可以作为一种单例的实现方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值