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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何万县 中级黑马   /  2012-4-29 00:49  /  3481 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public enum WeekDay{
  SUN{},MON{},TUE{},WED{},THU{},FRI{},SAT{};
  public abstract WeekDay nextDay();
}
为什么WeekDay的成员SUN,MON,TUE,WED,THU,FRI,SAT必须实现WeekDay的抽象方法nextDay();??????

9 个回复

正序浏览
因为枚举中的成员SUN,MON,TUE,WED,THU,FRI,SAT是枚举的对象,但是在这个枚举中有   public abstract WeekDay nextDay();      抽象方法,所以这里的成员 SUN,MON,TUE,WED,THU,FRI,SAT 都是 枚举类 WeekDay的子类的对象(因为此枚举中有抽象方法,所以此枚举为抽象类型的),子类如果要继承抽象类(枚举也算是一种特别的类),并且子类不为抽象,所以一定要实现父类的抽象方法。就如同  WeekDay SUN = new  WeekDay{ public WeekDay nextDay();//WeekDay是抽象的,不能直接new  所以后边要用匿名内部类。
}
回复 使用道具 举报
1枚举(Enum):我们所定义的每个枚举类型都继承自java.lang.Enum 类,枚举中的每个成员默认都是public static final 的。
2 而每个枚举的成员其实就是您定义的枚举类型的一個实例(Instance)。换句话说,当定义了一个枚举类型后,在编译时刻就能确定该枚举类型有几个实例,分别是什么。在运行期间我们无法再使用该枚举类型创建新的实例了,这些实例在编译期间就已经完全确定下来了。
回复 使用道具 举报
何万县 发表于 2012-4-29 15:41
实例跟对象有啥区别?

同一个东西,两种叫法。可以理解为是一个东西。
回复 使用道具 举报
回答你上面问题;实例就是对象,实例化就是创建对象,new对象的过程;
枚举就是一个特殊的类,枚举的列表就是它的静态对象,例如:
SUN是WeeKDay枚举的一个对象,它居然是类了那就有类应有的功能;
构造函数就可以直接跟在列表后面加个圆括号来传入参数供初始化;
类有方法,枚举也有,而枚举对象为了实现不同的方法体,就把方法抽取出定义为抽象方法,这样枚举要创建对象时就得使用它的子类来创建;
我们可以再枚举列表后加大括号来写实现的子类,就像匿名内部类;就可以把SUN(){}这样写,在大括号里实现父类的抽象方法;
回复 使用道具 举报
jiyixuan 发表于 2012-4-29 08:36
枚举类型的每一个成员都以该类型的一个实例,而且默认的都是声明为public static final的。这是枚举类的规 ...

实例跟对象有啥区别?
回复 使用道具 举报
枚举类型的每一个成员都以该类型的一个实例,而且默认的都是声明为public static final的。这是枚举类的规则而已。即然是实例,肯定是继承或者覆盖父类的抽象方法。
回复 使用道具 举报
没有为什么,因为它是被定义一个枚举类。
所以就是要将类中元素当做一个子类,就像一个抽象类
而子类必须覆盖父类的抽象方法才能实例化。这是规定
回复 使用道具 举报
这里的SUN{},MON{},TUE{},WED{},THU{},FRI{},SAT{};都是WeekDay可以选择的对象,而且它们都调用了无参构造方法,所以它们必须作为枚举子类的对象。枚举类中有抽象方法的话,子类对象就一定要实现父类的抽象方法。
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。


回复 使用道具 举报
为什么WeekDay的成员SUN,MON,TUE,WED,THU,FRI,SAT必须实现WeekDay的抽象方法nextDay();??????
SUN,MON,TUE,WED,THU,FRI,SAT就相当于WeekDay的子类,当父类有抽象方法时,子类要么去实现父类的抽象方法,要么子类继续成为抽象类。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马