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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李万海 中级黑马   /  2013-3-26 21:00  /  1189 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李万海 于 2013-3-27 09:13 编辑
  1. public enum Lamp {
  2.         S2N("N2S"),S2W("E2W"),E2W("W2E");
  3.         private Lamp(String next){
  4.                 this.next = Lamp.valueOf(next);
  5.                 System.out.println(next);
  6.         }
  7.         private Lamp next;
  8.         public Lamp getNext() {
  9.                 return next;
  10.         }
  11. }
复制代码
为什么像这样,把Lamp.valueOf(next)放在构造方法里,枚举就不能被成功创建了?
是不是Lamp.valueOf()方法要用到当前的枚举实例?
可是它是怎么获取当前的枚举实例的呢?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

2 个回复

倒序浏览
该枚举类型在整个工程中都是可见的.
回复 使用道具 举报
1 枚举类的构造方法只能使用private访问控制,如果省掉了构造函数的访问控制符则默认使用private修饰,如果强制指定访问控制符,则只能是private修饰符。
2 枚举的所以实例必须在枚举类中显示的列出来吗,否则枚举将永远不会产生实例,列出这些实例时,系统自动添加public static final 修饰,无需显示的添加。
3 所有的枚举类都提供了一个values方法,该方法可以遍历是所有的枚举值。
如下 定义了一个枚举类
public enum SeasonEnum
{
    SPRING,SUMMER,FALL,WINTER;
}
编译该javas文件将产生和一个SessionEnum.class文件,这表明枚举是一个特殊的java类,enum关键字和class,interface关键字作用大致相同。
定义枚举时要显示的列出所有的枚举值每个枚举值用英文逗号隔开,枚举值列举完后好用分号结束。这些枚举值代表了枚举的所有可能实例。
使用枚举看下面实例代码:
public class TestEnum
{
    public void judge(SeasonEnum s)
    {
        //switch语句里的表达式可以是枚举值
        switch (s)
        {
            case SPRING:
                System.out.println("春暖花开,正好踏青");
                break;
            case SUMMER:
                System.out.println("夏日炎炎,适合游泳");
                break;
            case FALL:
                System.out.println("秋高气爽,进补及时");
                break;
            case WINTER:
                System.out.println("冬日雪飘,围炉赏雪");
                break;
        }
    }
    public static void main(String[] args)
    {
        //所有枚举类都有一个values方法,返回该枚举类的所有实例
        for (SeasonEnum s : SeasonEnum.values())
        {
            System.out.println(s);
        }
        new TestEnum().judge(SeasonEnum.SPRING);
    }
}
上面程序测试了SessionEnum枚举类的用法,该类通过values方法返回该枚举类的所有实例并且通过循环输出了SessionEnum枚举的所有实例。
二 枚举类的属性,方法和构造方法
  枚举也是一种类,也有自己的属性和构造方法下面定义了还有一个枚举该枚举包含了一个name属性。
public enum Gender
{
    MALE,FEMALE;
    public String name;
}
上面枚举定义了一个name属性下面通过程序来使用该枚举:
ublic class TestGender
{
    public static void main(String[] args)
    {
        Gender g = Enum.valueOf(Gender.class , "FEMALE");
        g.name = "女";
        System.out.println(g + "代表:" + g.name);
    }
一旦为枚举类显示定义类带参数的构造方法,则列举枚举时也必须对应的传入参数。
如下代码:
public enum Gender
{
    //此处的枚举值必须调用对应构造器来创建
    MALE("男"),FEMALE("女");
    private String name;
    //枚举类的构造器只能使用private修饰
    private Gender(String name)
    {
        this.name = name;
    }
    public String getName()
    {
         return this.name;
    }
}
从上面程序可以看出我们为Gender类创建了一个构造方法,列举枚举值时要传入参数,实际上就是调用构造方法创建枚举类对象,只是这里无需new关键字。无需显示调用构造方法。相当与以下代码:
public static final Gender MALE=new Gender("男");
public static final Gender FEMAL=new Gender("女");


三 实现接口的枚举
枚举也可以实现一个或者多个接口与普通类一样,实现接口时候也必须实现接口里的方法下面程序第一个接口
public interface GenderDesc{
void info();
}
下面的Gender枚举实现了该接口并实现了info方法:
public enum Gender implements GenderDesc
{
    //此处的枚举值必须调用对应构造器来创建
    MALE("男")
    {
        public void info()
        {
            System.out.println("这个枚举值代表男性");
        }
    },
    FEMALE("女")
    {   
        public void info()
        {
            System.out.println("这个枚举值代表女性");
        }
    };
    private String name;
    //枚举类的构造器只能使用private修饰
    private Gender(String name)
    {
        this.name = name;
    }
    public String getName()
    {
         return this.name;
    }
   
}
编译上面程序时候,可以看到生成了Gender.class Gender$1.class和Gender$2.class文件,这三个文件正好证实了MALE,FEMALE实际上就是Gender匿名之类的实例而不是Gender类的实例。


四 包含抽象方法的枚举类
有一个Operation枚举类,他的四个枚举值是PLUS MINUS TIMES DIVID代表加减乘除为此我们定义下面枚举类:
ublic enum Operation
{
    PLUS, MINUS, TIMES, DIVIDE;
    //为枚举类定义一个方法,用于实现不同的运算
    public double eval_r(double x, double y)
    {
        switch(this)
        {
            case PLUS:   return x + y;
            case MINUS:  return x - y;
            case TIMES:  return x * y;
            case DIVIDE: return x / y;
            default: return 0;
        }
    }
    public static void main(String[] args)
    {
        System.out.println(Operation2.PLUS.eval_r(3, 4));
        System.out.println(Operation2.MINUS.eval_r(5, 4));
        System.out.println(Operation2.TIMES.eval_r(5, 4));
        System.out.println(Operation2.DIVIDE.eval_r(5, 4));
    }
}
上面的枚举类不难发现实际上PLUS MINUS TIMES DIVID四个值对应的eval方法各有不同的实现,为此我们采用前面的介绍的方法让它们为四个枚举值提供eval方法的实现然后在Operation类定义一个eval抽象方法。
public enum Operation2
{
    PLUS
    {
        public double eval_r(double x , double y)
        {
            return x + y;
        }
    },
    MINUS
    {
        public double eval_r(double x , double y)
        {
            return x - y;
        }
    },
    TIMES
    {
        public double eval_r(double x , double y)
        {
            return x * y;
        }
    },
    DIVIDE
    {
        public double eval_r(double x , double y)
        {
            return x / y;
        }
    };
    //为枚举类定义一个抽象方法,这个抽象方法由不同枚举值提供不同的实现
    public abstract double eval_r(double x, double y);
    public static void main(String[] args)
    {
        System.out.println(Operation.PLUS.eval_r(3, 4));
        System.out.println(Operation.MINUS.eval_r(5, 4));
        System.out.println(Operation.TIMES.eval_r(5, 4));
        System.out.println(Operation.DIVIDE.eval_r(5, 4));
    }
}


评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马