黑马程序员技术交流社区

标题: 枚举 [打印本页]

作者: 画饼    时间: 2013-6-15 13:15
标题: 枚举
为什么java 枚举不能被继承却可以有子类
作者: 张超    时间: 2013-6-15 16:56
1 如果被继承,则可能会出现 Father f = new Son();而枚举的特性是类变量的个数是确定的,破坏了他的特性.
作者: 苑永志    时间: 2013-6-15 17:09
本帖最后由 苑永志 于 2013-6-15 23:12 编辑

我估计楼主的意思是想问:枚举不能被继承,但是枚举中的元素却是枚举子类的实例,这是为什么呢?
其实张孝祥老师很详细的模拟过枚举的实现,代码如下:
  1. public abstract class WeekDay {
  2.         private String name;
  3.         
  4.         private WeekDay(){}
  5.         
  6.         public static final WeekDay SUN = new WeekDay1(){
  7.                 public WeekDay nextDay() {
  8.                         return MON;
  9.                 }
  10.         };
  11.         public static final WeekDay MON = new WeekDay1(){
  12.                 public WeekDay nextDay() {
  13.                         return SUN;
  14.                 }
  15.         };
  16.         
  17.         public abstract WeekDay nextDay();
  18.         
  19.         @Override
  20.         public String toString(){
  21.                 return this == SUN ? "SUN" : "MON";
  22.         }
  23. }
复制代码
枚举就好比是这个抽象类WeekDay,虽然不能直接被实例化(因为构造方法是private的),但是在类内部是可以直接使用构造方法的。
静态属性定义为WeekDay内部类的一个实例。这里的WeekDay是可以被继承的。枚举不能被继承,是java语言规范中要求的,为了满足枚举的一系列特性。
希望能帮助到楼主。
作者: Spole_168    时间: 2013-6-15 21:11
枚举类就相当于里边的属性字段值为常量finally类型的,构造方法是private的,不能直接实例化。。。
作者: 袁梦希    时间: 2013-6-16 08:26
大饼子   如果问题已经解决   把帖子的类型改为已解决
作者: 袁梦希    时间: 2013-6-16 08:27
苑永志 发表于 2013-6-15 17:09
我估计楼主的意思是想问:枚举不能被继承,但是枚举中的元素却是枚举子类的实例,这是为什么呢?
其实张孝 ...

哥们很强   高度赞赏  :handshake
作者: 何俊森    时间: 2013-6-16 09:48
话说我面试面到了这个问题。。
作者: 画饼    时间: 2013-6-16 09:53
苑永志 发表于 2013-6-15 17:09
我估计楼主的意思是想问:枚举不能被继承,但是枚举中的元素却是枚举子类的实例,这是为什么呢?
其实张孝 ...

就是问的这个。回答的很好
作者: 画饼    时间: 2013-6-16 09:54
袁梦希 发表于 2013-6-16 08:27
哥们很强   高度赞赏

哥哥,我不会关贴,能帮我搞搞吗
作者: 袁梦希    时间: 2013-6-16 10:02
画饼 发表于 2013-6-16 09:54
哥哥,我不会关贴,能帮我搞搞吗

嘿嘿  饼饼    点你这题下面有个编辑  然后“未解决”那有个分类,分类是下拉列表,找到已解决,选上,然后保存主题  就好了
作者: 画饼    时间: 2013-6-16 10:09
苑永志 发表于 2013-6-15 17:09
我估计楼主的意思是想问:枚举不能被继承,但是枚举中的元素却是枚举子类的实例,这是为什么呢?
其实张孝 ...

我还想问的是,张老师说new 类(){},这样是new一个子类,既然枚举元素都是该枚举的实例对象,那么枚举元素(){},不就是枚举的子类么?,至于内部类,不就是类内部的类么?内部类跟子类是有差别的,内部类不就是相当于类的成员变量一级别么?请恕我,还是不能理解,你可以企鹅944579708.给我说说么!
作者: 画饼    时间: 2013-6-16 10:15
袁梦希 发表于 2013-6-16 10:02
嘿嘿  饼饼    点你这题下面有个编辑  然后“未解决”那有个分类,分类是下拉列表,找到已解决,选上,然 ...

有截图么,懒得去找。嘿嘿,哥哥原谅个
作者: a767175432    时间: 2013-6-16 13:42
楼主,这个问题我是今天刚的到解决,枚举类是分为普通枚举类和抽象枚举类的!! 普通枚举使用final进行修饰不允许被继承了 张孝祥老师讲的枚举的时候获取红绿灯的那段代码有抽象方法,这个就是另一种枚举类--抽象枚举类,这种类并没有被fianl修饰,而枚举实例后面的花括号里的代码实际上是匿名内部类的语法,创建匿名子类对象。
  1. public abstract class WeekDay {
  2.         private String name;
  3.         
  4.         private WeekDay(){}
  5.         
  6.         public static final WeekDay SUN = new WeekDay1(){
  7.                 public WeekDay nextDay() {
  8.                         return MON;
  9.                 }
  10.         };
  11.         public static final WeekDay MON = new WeekDay1(){
  12.                 public WeekDay nextDay() {
  13.                         return SUN;
  14.                 }
  15.         };
  16.         
  17.         public abstract WeekDay nextDay();
  18.         
  19.         @Override
  20.         public String toString(){
  21.                 return this == SUN ? "SUN" : "MON";
  22.         }
  23. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2