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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 画饼 中级黑马   /  2013-6-15 13:15  /  2443 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么java 枚举不能被继承却可以有子类

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

12 个回复

倒序浏览
1 如果被继承,则可能会出现 Father f = new Son();而枚举的特性是类变量的个数是确定的,破坏了他的特性.
回复 使用道具 举报
本帖最后由 苑永志 于 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语言规范中要求的,为了满足枚举的一系列特性。
希望能帮助到楼主。

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 很给力!

查看全部评分

回复 使用道具 举报
枚举类就相当于里边的属性字段值为常量finally类型的,构造方法是private的,不能直接实例化。。。
回复 使用道具 举报
大饼子   如果问题已经解决   把帖子的类型改为已解决
回复 使用道具 举报
苑永志 发表于 2013-6-15 17:09
我估计楼主的意思是想问:枚举不能被继承,但是枚举中的元素却是枚举子类的实例,这是为什么呢?
其实张孝 ...

哥们很强   高度赞赏  :handshake
回复 使用道具 举报
话说我面试面到了这个问题。。
回复 使用道具 举报
画饼 中级黑马 2013-6-16 09:53:43
8#
苑永志 发表于 2013-6-15 17:09
我估计楼主的意思是想问:枚举不能被继承,但是枚举中的元素却是枚举子类的实例,这是为什么呢?
其实张孝 ...

就是问的这个。回答的很好
回复 使用道具 举报
画饼 中级黑马 2013-6-16 09:54:09
9#
袁梦希 发表于 2013-6-16 08:27
哥们很强   高度赞赏

哥哥,我不会关贴,能帮我搞搞吗
回复 使用道具 举报
画饼 发表于 2013-6-16 09:54
哥哥,我不会关贴,能帮我搞搞吗

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

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

有截图么,懒得去找。嘿嘿,哥哥原谅个
回复 使用道具 举报
楼主,这个问题我是今天刚的到解决,枚举类是分为普通枚举类和抽象枚举类的!! 普通枚举使用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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马