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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xuemeng 中级黑马   /  2013-5-17 16:09  /  1836 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xuemeng 于 2013-5-17 16:55 编辑

  枚举到底是什么?有什么用, 我完全不懂, enum Week {MON, TUE} 这句代码是什么意思?   还有, 枚举的方法到哪里查找, API中有个Enum类, 但是我根本就没有看到有张老师说的 valueOf(String str) values()方法啊

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

10 个回复

倒序浏览
本帖最后由 尹丽峰 于 2013-5-17 16:41 编辑

枚举的语法和用法
[访问修饰符 enum   枚举名
{值1,值2,值3……,值n}
访问修饰符:就是指访问的权限,现阶段 咱们都写成public
枚举的定义一般和类定义在同一级别,这样在同一个命名空间下的所有的类就都可以使用这个枚举了。
枚举的作用:限制用户不能随意赋值,只能在定义枚举是列举的值中选择。不需要死记每一个值是什么,只需要选择相应的值。
定义枚举时,值不能是int类型,枚举类型的变量都可以强制转换成一个int类型。
枚举的值定义时,有一个默认的编号,是从0开始的。
回复 使用道具 举报
尹丽峰 发表于 2013-5-17 16:16
枚举吧 就是在选择的时候只能选一个,选多了会出错,enum Week {MON, TUE}这个就是枚举中有两个对象 ...

那values()方法, 还有valueOf()方法在哪里查找啊? API上面要查找相关方法,具体应该在哪里查找?
我的意思 enum Week{MON,TUE}是什么意思, 是问, 如果用大白话怎么来描述它, 比如class Person {} ,定义一个类名为Person的类
回复 使用道具 举报
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如张老师讲的星期一到星期日的例子,七个数据元素组成了一周的“数据集”。但是在编程时我们规定了星期一用int型的1表示,但是别人在不知道的情况下可以用别的int型数字,这样写程序语法没有错,但是不符合实际要求,不知道楼主看懂张老师讲的用普通类实现枚举工能的例子没,在1.5之前只能那样写,但是写起来很麻烦啊,于是从1.5java提供了枚举类型,所有的枚举类型是java.lang.Enum的子类,它是一种新的类型,允许用常量来表示特定的数据片断,这些常量默认的是public static final修饰的,这些常量都是通过Enum中定义的构造函数进行初始化的。其实我觉得枚举就是在简化用普通类实现枚举的方法。如果有什么不对的地方请大家提出来,一块讨论
回复 使用道具 举报
本帖最后由 尹丽峰 于 2013-5-17 16:35 编辑

在api中  enum中有
static <T extends Enum<T>>
T
valueOf(Class<T> enumType, String name)
          返回带指定名称的指定枚举类型的枚举常量。

大白话就是 定义一个枚举 枚举中有两个对像
回复 使用道具 举报
尹丽峰 发表于 2013-5-17 16:32
在api中  enum中有
static  
T

  可是API中没有 valueOf()  和values()方法啊?
回复 使用道具 举报
java.exe 发表于 2013-5-17 16:30
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的 ...

感觉回答的很好啊 ,比先前要理解一些了!!
回复 使用道具 举报
Sword 金牌黑马 2013-5-17 16:42:57
8#
举个例子,要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
总结:枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象
enum Week {MON, TUE}中的Week就相当于一个类,其中的MON、TUE相当于该WEEK类的两个实例对象。
补充一些关于枚举的内容:
二、枚举的高级应用:
1.枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
2.枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
3.带构造方法的枚举
构造方法必须定义成私有的
如果有多个构造方法,该如何选择哪个构造方法?
枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
4.带方法的枚举
定义枚举TrafficLamp
实现普通的next方法
实现抽象的next方法:每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
增加上表示时间的构造方法
5.枚举只有一个成员时,就可以作为一种单例的实现方式。
枚举中涉及的几个知识点
1、构造器:
1)构造器只是在构造枚举值的时候被调用。
2)构造器只有私有private,绝不允许有public构造器。这样可以保证外部代码无法重新构造枚举类的实例,这样是合情合理的,因为枚举值是public static final的常量,但是枚举类的方法和数据域是可以被外部访问的。
3)构造器可以有多个,调用哪个即初始化相应的值。
2、所有的枚举类都继承了Enum方法,方法如下:
1)toString() ---> 返回枚举量的名称
2)ordina() ---> 返回枚举值在枚举类中的顺序,按定义的顺序排
3)getClass() ---> 获取对应的类名
静态方法:
1)valueOf(String e) ---> 转为类中对应的对象,即将字符串转为对象
2)values() ---> 获取数组,将元素放入一个数组中。
注意:
1、元素列表即所有的元素项目,必须放在整个类的最前面。
2、元素列表后要有分号
3、枚举类中的方法为private
4、在元素后跟上(),就可指定要使用的构造方法,含参数。
5、枚举类中的每个元素都是它的一个子类对象,当枚举类中存在abstract方法,须在子类后加{},并在其中实现此方法。
如果你的JDK的版本在1.5以上,应该有静态方法:valueOf(String e) 和values()
回复 使用道具 举报
Sword 发表于 2013-5-17 16:42
举个例子,要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int ...

谢谢!!  回答的很完整!再去看看视频!!不过很纳闷, 我的API上面居然没有valueOf 和values方法!!
回复 使用道具 举报
xuemeng 发表于 2013-5-17 16:38
感觉回答的很好啊 ,比先前要理解一些了!!

你所说的那个values()方法是个隐藏的静态方法,所谓隐藏就是在编译的时候根据具体枚举类型自动生成的,所以在文档中找不到。
回复 使用道具 举报
java.exe 发表于 2013-5-17 16:57
你所说的那个values()方法是个隐藏的静态方法,所谓隐藏就是在编译的时候根据具体枚举类型自动生成的, ...

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