鱼C论坛

 找回密码
 立即注册

自我敦促的Java学习笔记(六)

已有 161 次阅读2015-3-23 12:06 |个人分类:java学习

枚举

1.早期枚举

枚举的主要功能就是提供一系列的值供程序使用;

早期Java不支持枚举,所以一般将常量在类,抽象类(类和抽象类中的常量需要用关键字final进行声明),接口中声明,同时为了避免其类被实例化,可以在这些常量之前加上static

字符常量的好处是方便理解代码含义,从而方便代码维护;

早期定义方法的缺点:能够处理不是特定的指定的数,可以使用参数进行范围检查,但是这个必须在程序运行后才可以检查。而枚举可以将这一过程提前到编译期;

 

2.枚举的定义

[public] enum(关键字) 枚举名

//访问权限 public(任意处使用)和默认(尽在当前包中使用),枚举名可以由字母,数字,下划线,数字不可以开头

{

   枚举成员1

   枚举成员2,              //命名规则:由字母,数字,下划线,数字不可以开头像所      

   枚举成员3,              有常量一样名称中的每一个字母都要大

……

   枚举成员n

}

 

枚举也可以嵌到类中;

在定义一个枚举型时,实际上是产生一个从java.lang.Enum继承而来的类,而每个被枚举的成员实际上就是定义这个枚举的实例,并且它们被默认为final类变量 同时也是publicstatic,所以被枚举的值无法改变,并且可以通过枚举的名称直接使用。

 

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)对于固定不变的值,选择使用常量或者枚举的依据是什么?

答:如果常量之间没有逻辑上额联系,那么一般就可以直接以普通常量的方式来使用,如果常量并非孤立存在(一个常量和其他常量一起表示一系列可以相互转换的状态),则通常采用枚举的形式来表现这一系列常量。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-17 10:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部