常量的定义和使用
在Java中,我们可以通过static final来定义常量。例如,我们希望定义周一到周日这7个常
量,可以用7个不同的int表示:
?
public class Weekday{
public static final int SUN 0;
public static final int MON 1;
public static final int TUE 2;
public static final int WED 3;
public static final int THU 4;
public static final int FRI 5;
public static final int SAT 6;
}
?无论是int常量还是String常量,使用这些常量来表示一组枚举值的时候,有一个严
重的问题就是,编译器无法检查每个值的合理性。
?enum
为了让编译器能白动检查某个值在枚举的集合内,并且,不同用途的枚举需要不同的类型来标记,不能混用,我们可以使用enum来定义枚举类:
?注意:定义枚举类是通过关键字enum实现的,我们只需依次列出枚举的常量名
枚举和int定义的常量相比,使用enum定义枚举有如下好处:
首先,enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出
类型错误。其次,不可能引用到非枚举的值,因为无法通过编译。
最后,不同类型的枚举不能互相比较或者赋值,因为类型不符
?eg1
package com.xn.Tue;
//enum枚举
public class Tue02 {
public static void main(String[] args) {
Week dayOfweek1 = Week.FRI;
System.out.println(dayOfweek1.toString());
}
}
enum Week {
// 当前枚举值
MON("星期一"), TUE("星期二"), WEN("星期三"), TUR("星期四"), FRI("星期五"), SAT("星期六"), SUN("星期天");
// 成员变量
private String value;
// 构造方法(必须私有)
private Week(String value) {
this.value = value;
}
// 重写Object类的toString()方法
@Override
public String toString() {
return this.value;
}
}
//类
/*
final class Weekx {
private String weekName;
public static final Weekx MON = new Weekx("星期,");
public static final Weekx TUE = new Weekx("星期二");
public static final Weekx WEN = new Weekx("星期三");
public static final Weekx THR = new Weekx("星期四");
public static final Weekx FRI = new Weekx("星期五");
public static final Weekx SAT = new Weekx("星期六");
public static final Weekx SUN = new Weekx("星期日");
//构造方法私有化
private Weekx(String weekName) {
this.weekName = weekName;
}
//重写Object类tostring()
@Override
public String toString() {
return this.weekName;
}
}
*/
?eg2
package com.xn.Tue;
public class Tue03 {
public static void main(String[] args) {
Color red=Color.RED;
System.out.println(red);
}
}
enum Color{
RED(255,0,0),GREEN(255,0,0),PINK(255,255,0),GRAY(255,0,255),BLACK(255,255,255),WHITE(0,0,0);
private int red;
private int blue;
private int green;
private Color(int red,int blue,int green) {
this.red=red;
this.blue=blue;
this.green=green;
}
@Override
public String toString() {
return String.format("red:%d,blue:%d,green:%d", red,blue,green);
}
}
enum类型
通过enum定义的枚举类,和其他的c1ass有什么区别?答案是没有任何区别。
enum定义的类型就是class,只不过它有以下几个特点:
1、定义的enum类型总是继承白java.lang.Enum,且无法被子类继承;
2、只能定义出enum的实例,而无法通过new操作符创建enum的实例;
3、定义的每个实例都是引用类型的唯一实例;可以将enum类型用于switch语句。
小结
Java使用enum定义枚举类型,它被编译器编译为final class Xxx extends Enum
通过name()获取常量定义的字符串,注意不要使用toString()
通过ordinal()返回常量定义的顺序(无实质意义)可以为enum编写构造方法、字段和方法
enum的构造方法要声明为private,字段强烈建议声明为final
enum适合用在switch语句中
?