|
枚举
1.早期枚举
枚举的主要功能就是提供一系列的值供程序使用;
早期Java不支持枚举,所以一般将常量在类,抽象类(类和抽象类中的常量需要用关键字final进行声明),接口中声明,同时为了避免其类被实例化,可以在这些常量之前加上static;
字符常量的好处是方便理解代码含义,从而方便代码维护;
早期定义方法的缺点:能够处理不是特定的指定的数,可以使用参数进行范围检查,但是这个必须在程序运行后才可以检查。而枚举可以将这一过程提前到编译期;
2.枚举的定义
[public] enum(关键字) 枚举名
//访问权限 public(任意处使用)和默认(尽在当前包中使用),枚举名可以由字母,数字,下划线,数字不可以开头
{
枚举成员1,
枚举成员2, //命名规则:由字母,数字,下划线,数字不可以开头像所
枚举成员3, 有常量一样名称中的每一个字母都要大
……
枚举成员n
}
枚举也可以嵌到类中;
在定义一个枚举型时,实际上是产生一个从java.lang.Enum继承而来的类,而每个被枚举的成员实际上就是定义这个枚举的实例,并且它们被默认为final类变量 同时也是public和static,所以被枚举的值无法改变,并且可以通过枚举的名称直接使用。
3.枚举中可以使用的方法
(1)values方法
(2)Ordinal方法
(3)枚举值的比较和使用不多的compareTo方法
import java.awt.Color;
enum EnumColor
{
RED,
BLUE,
BLACK,
GREEN//这里没有符号
}
class Game
{
private Color bgcolor;
void setBgcolor(EnumColor bgcolor)
{
switch(bgcolor)
{
case RED:
this.bgcolor = new Color(255,0,0);
break;
case BLUE:
this.bgcolor = new Color(0,0,255);
break;
case BLACK:
this.bgcolor = new Color(0,0,0);
break;
case GREEN:
this.bgcolor = new Color(0,255,0);
break;
}
}
}
public class TestEnum {
public static void main(String[] args)
{
Game game = new Game();
EnumColor eC = EnumColor.BLUE;//通过枚举的名称直接使用
game.setBgcolor(EnumColor.BLUE);
for(EnumColor ec: EnumColor.values())//values()返回枚举成员集合
{
System.out.println(ec);//通过自动调用toString方法可以输出枚举名称
System.out.println(ec+" "+ec.ordinal());//ordinal()返回枚举常量的序号
}
System.out.println(eC.compareTo(EnumColor.BLUE));
System.out.println(eC.compareTo(EnumColor.RED));
System.out.println(EnumColor.BLACK.compareTo(EnumColor.GREEN));
//compareTo方法这里的结果为0则两者相等,结果为1则调用该方法的对象比作为参数的对象晚声明否则早声明。
System.out.println(eC==EnumColor.BLUE);
System.out.println(eC==EnumColor.BLACK);
//==比较引用是否相等
}
}
4.为枚举添加构造器
package color;
import java.awt.Color;
enum EnumColor1
{
RED("红色"),
BLUE("蓝色"),
BLACK("黑色"),
GREEN("绿色");
private String summy;
private EnumColor1(String summy)//该语句RED("红色")中的“红色”是作为参数赋值给这个构造方法的参数,注意这个构造方法的访问权限是私有的;
{
this.summy = summy;//this.后面的summy指的是EnumColor1中定义的私有数据
}
public String getSummy()
{
return summy;//返回调用该方法的常量(例如RED)的在定义时的括号里面的字符串
}
}
public class TestEnum {
public static void main(String[] args)
{
for(EnumColor1 ec: EnumColor1.values())
{
System.out.println(ec);
System.out.println(ec.getSummy());//这里注意是类中的常量在调用类中的方法
}
}
}
5.为枚举添加方法
enum EnumColor1
{
RED,
BLUE,
BLACK,
GREEN;//貌似如果这个常量后面还有其他的语句就要加上‘;’
public String getSummy()
{
String summy = "";
switch(this.ordinal())//同过ordinal方法取得枚举定义符号
{
case 0:
summy = "红色";
break;
case 1:
summy = "蓝色";
break;
case 2:
summy = "黑色";
break;
case 3:
summy = "绿色";
break;
}
return summy;
}
}
public class TestEnum {
public static void main(String[] args)
{
for(EnumColor1 ec: EnumColor1.values())
{
System.out.println(ec);
System.out.println(ec.getSummy());
}
}
}
6.习题
(1)将性别定义成枚举类型Sex,然后在一个名为Person的类中使用其作为性别属性
package color;
enum EnumSex
{
MAN,
FEMALE;
}
class Person
{
EnumSex sex;
public void setSex(String sex)
{
if(sex == "男人")
this.sex = EnumSex.MAN;
else
this.sex = EnumSex.FEMALE;
}
public EnumSex getSex()
{
return this.sex;
}
}
public class Question7_1 {
public static void main(String[] args)
{
Person p = new Person();
p.setSex("女人");
System.out.println(p.getSex());
}
}
(2)对于固定不变的值,选择使用常量或者枚举的依据是什么?
答:如果常量之间没有逻辑上额联系,那么一般就可以直接以普通常量的方式来使用,如果常量并非孤立存在(一个常量和其他常量一起表示一系列可以相互转换的状态),则通常采用枚举的形式来表现这一系列常量。
小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)
GMT+8, 2024-5-17 10:06
Powered by Discuz! X3.4
© 2001-2023 Discuz! Team.