A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李震 李震 李震 中级黑马   /  2012-3-28 01:46  /  2260 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是枚举,枚举一般那些地方用的最多。

9 个回复

倒序浏览
我也刚看好张孝祥老师讲的枚举 我说下自己的见解吧。。 其实枚举我觉得最大的作用就是 约束  定义一种规范 比如你有一个用户的实体类 而用户有一个属性是星座 这个时候你或许不想让别人随便输入 就要通过枚举来选择
其实我觉得能实现这种规范的方法很多 可能枚举也是对程序内部的一种约束和保护吧
回复 使用道具 举报
1. 在J2SE5.0中要定义枚举类型是使用enum关键词,枚举类型主要提供一些常数。如下列代码定义了Action枚举类型:

  Java代码

  public enum Action

  {

  TURN_LEFT,

  TURN_RIGHT,

  SHOOT

  }

  在Action.java中编写此段代码并编译,虽然语法上不像是在定义类,但枚举类型本质上就是一个类。所以编译完成后,会产生一个Action.class文件。

  下面的代码是说明如何使用定义好的枚举类型一个示例:

  Java代码

  public class EnumDemo

  {

  public static void main(String[] args)

  {

  doAction(Action.TURN_RIGHT);

  }

  public static void doAction(Action action)

  {

  switch(action)

  {

  case TURN_LEFT:

  System.out.println("向左转");

  break;

  case TURN_RIGHT:

  System.out.println("向右转");

  break;

  case SHOOT:

  System.out.println("射击");

  break;

  }

  }

  }

  运行结果:向右转。其中doAction()方法所接受的变量必须是Action枚举类型,如果对此方法输入其他类型的变量,编译器会报告错误。另外,如果在上面的switch中加入了不属于Action中枚举的值,编译器也会报告错误。例如:在上面代码case SHOOT段下面再加上以下代码:

  case STOP:

  System.out.println("STOP");

  break;

  则在编译时编译器会显示以下错误:

  unqualified enumeration constant name required

  case STOP:

回复 使用道具 举报
我也在论坛提问过:可惜没人回答!自己百度搜罗了些,分享咯!!
java中枚举的特点,和普通类的去区别。
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例;即构造函数私有化

2.所有枚举值都是 public , static , final 的。
(注意:这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。)

3.Enum默认实现了java.lang.Comparable接口;

4.Enum重载了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”;

5.Enum提供了一个valueOf方法,它和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue
因此在重写toString方法的时候就要注意到这一点,一般来说应该相对应地重写valueOf方法;

6.Enum还提供了values方法,该方法可以方便的遍历所有的枚举值;

7.Enum还有一个oridinal的方法,该方法返回枚举值在枚举类中的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。

回复 使用道具 举报
当你想要构造函数自动私有化,想要对象自己规定几个就几个,
想要方便的遍历对象(枚举值),想要让对象有顺序。如:
你想要一个交通灯的类,这个类只有红。黄。绿。三个对象
此时就可以用枚举,它自动私有化构造函数,自动给对象加
public stati final修饰,你就省事多了,取对象也好取,类名.枚举元素名。
回复 使用道具 举报
  看了大家的回复,总结了一下。清楚多了,谢谢了!
回复 使用道具 举报
袁野 黑马帝 2012-3-28 07:01:05
7#
枚举类似迭代器!在Vector<E>类中 Enumeration<E> elements() ,  返回此向量的组件的枚举。  Enumeration 是一个接口 她就是枚举
  
回复 使用道具 举报
抓哇 初级黑马 2012-3-28 09:07:21
8#
袁野 发表于 2012-3-28 07:01
枚举类似迭代器!在Vector类中 Enumeration elements() ,  返回此向量的组件的枚举。  Enumeration 是一个 ...

枚举非枚举器 枚举器也叫反复器已经不多用了被迭代器替代了
而枚举是c里的 而enum在5版本以前都是作为保留关键字JAVA5才重新把他引过来使用 也给他搞成类 给他增加一些自带方法 这样就给JAVA体系的普通类 (抽象类接口类)又增加了一个新成员 他们地位是平级的分别用关键字class interface enum标示
回复 使用道具 举报
枚举产生的原因:枚举就是让某个类型的变量的取值只能为若干固定值中的一个

,否则编译器就报错,枚举可以让编译器在编译时就可以控制源程序中填写的非

法值,普通变量的方式无法在开发阶段就实现这一目标。我们的一周有七天,若

不小心在开发中将值设置为不符合常理的数编译时不会报错;
这时候我们可以自定义一个类型,当用到这个类型的时候,就只能取这个类型中

规定的值,如果不是的话就会编译提醒不合法,我们说能在编译时发现的问题尽

量不要拖到运行期间。这时候我们如果已经定义好weekday这个类的取值只能是1

-7那么一下程序就会编译通不过。
也就是说,枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。
枚举可以有抽象方法以及构造方法,每个枚举元素要实现抽象方法
public class EnumDemo {
public static void main(String[] args) {
  Light.RED.getNext().getNext().getNext();
}

}
enum Light
{
RED(30)
{
  public Light getNext() {
    System.out.println("red");
   
   return GREEN;
  }},
GREEN(35)
{
  public Light getNext() {
   System.out.println("green");
   return YELLOW;
  }},
YELLOW(5)
{
  public Light getNext() {
   System.out.println("yellow");
   return RED;
  }};
private int time;
private Light(int time)
{this.time = time;}
public abstract Light getNext();
}


回复 使用道具 举报
枚举产生的原因:枚举就是让某个类型的变量的取值只能为若干固定值中的一个

,否则编译器就报错,枚举可以让编译器在编译时就可以控制源程序中填写的非

法值,普通变量的方式无法在开发阶段就实现这一目标。我们的一周有七天,若

不小心在开发中将值设置为不符合常理的数编译时不会报错;
这时候我们可以自定义一个类型,当用到这个类型的时候,就只能取这个类型中

规定的值,如果不是的话就会编译提醒不合法,我们说能在编译时发现的问题尽

量不要拖到运行期间。这时候我们如果已经定义好weekday这个类的取值只能是1

-7那么一下程序就会编译通不过。
也就是说,枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。
枚举可以有抽象方法以及构造方法,每个枚举元素要实现抽象方法
public class EnumDemo {
public static void main(String[] args) {
  Light.RED.getNext().getNext().getNext();
}

}
enum Light
{
RED(30)
{
  public Light getNext() {
    System.out.println("red");
   
   return GREEN;
  }},
GREEN(35)
{
  public Light getNext() {
   System.out.println("green");
   return YELLOW;
  }},
YELLOW(5)
{
  public Light getNext() {
   System.out.println("yellow");
   return RED;
  }};
private int time;
private Light(int time)
{this.time = time;}
public abstract Light getNext();
}


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马