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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马王冬冬 中级黑马   /  2012-7-30 14:11  /  4170 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public enum Operation2
  2. {
  3.         PLUS
  4.         {
  5.                 public double eval(double x , double y)
  6.                 {
  7.                         return x + y;
  8.                 }
  9.         },
  10.         MINUS
  11.         {
  12.                 public double eval(double x , double y)
  13.                 {
  14.                         return x - y;
  15.                 }
  16.         },
  17.         TIMES
  18.         {
  19.                 public double eval(double x , double y)
  20.                 {
  21.                         return x * y;
  22.                 }
  23.         },
  24.         DIVIDE
  25.         {
  26.                 public double eval(double x , double y)
  27.                 {
  28.                         return x / y;
  29.                 }
  30.         };
  31.         public abstract double eval(double x, double y);//位置1,此处为枚举类定义了一个抽象方法
  32.         public static void main(String[] args)
  33.         {
  34.                 System.out.println(Operation.PLUS.eval(3, 4));
  35.                 System.out.println(Operation.MINUS.eval(5, 4));
  36.                 System.out.println(Operation.TIMES.eval(5, 4));
  37.                 System.out.println(Operation.DIVIDE.eval(5, 4));
  38.         }
  39. }
复制代码
今天读书的时候发现这样一段代码,位置1处的代码好像很多余,是不是去掉也没有区别,不明白此处为何非要定义这么一个抽象方法?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

7 个回复

正序浏览
简单的说一下枚举类的一些特点:1.枚举类可以有自己的构造器,但是枚举类

的实例必须显示的列举出来的,否则不能产生实例。这跟普通类不一样。2.枚

举类型如果有abstract方法的成员,那么必须保证枚举类有一个以上的枚举常

量,并且每个枚举常量都提供了该成员的具体实现类体。这个程序正是因为枚

举有这样的一个特点,所以定义一个抽象的eval方法成员,然后在枚举常量中

实现不同的方法。这个好模拟了算数运算的。如果没有了抽象的方法编译会出现问题。

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王程 中级黑马 2012-7-30 20:39:56
7#
PLUS这个实例对象不是枚举的实例对象,而是它的子类的实例对象,枚举是一个类,而枚举类的一个元素相当于该类的一个实例对象,因为这个枚举类带有一个抽象方法,所以实例对象不能直接new出来,但是可以通过枚举的子类new出来,需要重写抽象方法,抽象方法就是 public abstract double eval(double x, double y),子类的代码写在{}中,用子类new出来的对象是PLUS,如果把抽象方法去掉,实例对象中的方法就是无中生有的。顺便提一句,System.out.println(Operation2.PLUS.eval(3, 4));输入代码要仔细啊
回复 使用道具 举报
  System.out.println(Operation.PLUS.eval(3, 4));
就用这一条来说吧,其实不定义抽象方法也是可以的,但是关键是用了Operation调用这就必须定义抽象方法
就想内部类是外部类的父类似的,子类复写了父类的抽象方法
重要的是用父类的类名调用了一些方法那么就必须定义抽像类,这是因为当用父类名调用子类的方法时,父类必须有该方法,不然就会发生编译错误。
回复 使用道具 举报
  1. PLUS

  2. 04.        {

  3. 05.                public double eval(double x , double y)

  4. 06.                {

  5. 07.                        return x + y;

  6. 08.                }

  7. 09.        },
复制代码
楼主,枚举内部的元素都可以看做一个对象,这个对象在底层创建的时候是通过匿名内部类来创建的,匿名内部类的格式是new父类的接口,大括号实现接口内的方法,这个匿名内部类就相当于这个接口的子类了,所以枚举内的元素都是枚举这个类的子类对象。
回复 使用道具 举报
陈红建 来自手机 中级黑马 2012-7-30 18:11:29
板凳
手机党路过了。我只知道,抽象类里面最少也要有一个抽象方法,如果他没有抽象方法那这个抽象类就没价值。我是路过围观的。不用管我了

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 手机上的,应该奖励一下

查看全部评分

回复 使用道具 举报
enum类是很特殊的一个类,实际上它是一个抽象类。
枚举中可以用抽象方法,但是枚举中的每一个对象都分别实现抽象方法;
public abstract double eval(double x, double y);把这句去掉,主函数里System.out.println(Operation.PLUS.eval(3, 4));,就无法调用eval方法了。
回复 使用道具 举报
不多余,如果没有这一行代码,那么假如枚举类没有这个方法,但是调用了eval方法,这样main方法不是会抛出一个异常吗?主要是防止异常用的,你可以试试,去掉这一行,在去掉枚举类中的eval方法,试试
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马