黑马程序员技术交流社区
标题:
枚举的是对象呢?还是子类对象?
[打印本页]
作者:
清水
时间:
2013-1-3 10:08
标题:
枚举的是对象呢?还是子类对象?
在听张老师视频的时候,刚开始理解枚举类中的第一行表示的是该类的一个对象。可是,后面讲着讲着,似乎就变成子类对象了(继承了这个枚举类的子类的对象)。
大家是怎么理解的?
作者:
而今从头越2012
时间:
2013-1-3 10:33
枚举就是一个对象,这个对象也包括子类对象的。下面通过两段代码体会一下枚举的使用吧:
(1)一个相对简单的枚举:
public enum ColorEnum {
RED,
GREEN,
BLUE;
public static void main(String[] args) {
// 获得枚举实例序号
int index = RED.ordinal();RED.compareTo(RED);
// 返回所有的枚举实例
ColorEnum[] colors = ColorEnum.values();
// 获得实例的名称
String colorName = GREEN.name();
// 通过实例名称来获得枚举实例
ColorEnum color = ColorEnum.valueOf(colorName);
/* 比较两个枚举的方法一
* 比较方式是比较枚举的ordinal
*/
int compare = BLUE.compareTo(BLUE);
/* 比较两个枚举的方法二
* 枚举支持直接用这种逻辑表达式方式作比较
*/
boolean isEqual = RED == GREEN;
// 枚举支持直接用switch作选择
switch (BLUE) {
case RED: break;
case GREEN: break;
case BLUE: break;
default: break;
}
}
}
(2)一个不那么简单的枚举:
import java.awt.Color;
import java.io.Serializable;
/**
* 颜色的枚举
* 是能实现接口
* 不能继承
* @author
*/
public enum ColorEnum implements Serializable {
/**
* 红色
*/
RED(255, 0, 0) {
public void doSomeThing() {
System.out.println(name());
}
},
/**
* 绿色
*/
GREEN(0, 255, 0) {
public void doSomeThing() {
System.out.println(ordinal());
}
},
/**
* 蓝色
*/
BLUE(0, 0, 255) {
@Override
public void doSomeThing() {
System.out.println(toString());
}
};
/**
* 颜色
*/
private Color color;
/**
* 实例化颜色枚举
* 枚举字段的实例化将会调用这个构造方法
* 必须用private修饰
* 代表只有本枚举自己能够构造
* 枚举的实例都是静态的
* 会在第一次访问的时候就生成
* @param r 红色
* @param g 绿色
* @param b 蓝色
*/
private ColorEnum(int r, int g, int b) {
this.color = new Color(r, g, b);;
}
/**
* @return 颜色实体
*/
public Color getColor() {
return color;
}
/**
* 定义抽象方法
* 实例必须实现它
*/
abstract void doSomeThing();
public static void main(String[] args) {
Color color = RED.getColor();
GREEN.doSomeThing();
}
}
作者:
清水
时间:
2013-1-3 10:47
看起来感觉还算正确,楼上好强!
不过,枚举是子类对象的话,那么每个子类就只有1个对象,岂不浪费?
作者:
何竹冬
时间:
2013-1-3 22:37
本帖最后由 何竹冬 于 2013-1-3 22:39 编辑
你好
枚举是对有限数量的一类事物的描述。比如星期、月份等。
枚举中元素的类型就是这类事物的类型,枚举构造方法必须是私有的,不能直接new枚举类的对象。
如果枚举对象要使用枚举类中的抽象方法,就需要枚举中的元素实现抽象方法自定义要实现的功能。
也就是创建子类对象用匿名内部类实现。
如星期枚举类
public class EnumTest
{
public static void main(String[] args)
{
WeekDay w=WeekDay.SUN;
System.out.println(w.nextDay().toString());
}
public enum WeekDay
{
//给枚举类中的元素初始化,创建子类对象实现抽象方法
SUN
{
public WeekDay nextDay()
{
return MON;
}
},
MON
{
public WeekDay nextDay()
{
return TUE;
}
},
TUE
{
public WeekDay nextDay()
{
return WEN;
}
},
WEN
{
public WeekDay nextDay()
{
return THUR;
}
},
THUR
{
public WeekDay nextDay()
{
return FRI;
}
},
FRI
{
public WeekDay nextDay()
{
return SAT;
}
},
SAT
{
public WeekDay nextDay()
{
return MON;
}
};
public abstract WeekDay nextDay();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2