枚举类型(enum)

枚举类型(enum)
JDK1.5增加了枚举类型,可以使用enum来定义
例如:
public enum Gender{
    MALE,FEMALE;
}
其中每一个枚举元素都是该枚举类型的一个实例,并且默认是用public static final修饰的

1)枚举类型和类的关系
    把Gender.class反编译后显示如下:
    public final class com.briup.test.Gender extends java.lang.Enum<com.briup.test.Gender> {
      public static final com.briup.test.Gender MALE;
      public static final com.briup.test.Gender FEMALE;
      private static final com.briup.test.Gender[] ENUM$VALUES;
      static {};
      private com.briup.test.Gender(java.lang.String, int);
      public static com.briup.test.Gender[] values();
      public static com.briup.test.Gender valueOf(java.lang.String);
    }

    说明枚举类型本质还是一个类,而且默认就是fianl修饰以及默认继承父类java.lang.Enum。

    同时构造器是自动生成的且是私有的,表示不可再创建对象。(使用反射也不行)
        private Gender(String name,int ordinal)
        name   : 枚举对象的名字
        ordinal: 枚举元素的编号,默认从0开始
        
    我们在枚举中所写的MALE和FEMALE其实就是Gender类型的俩个固定的对象。(public static final)

注:enum是java中的一个关键字,Enum是java中的一个类

2)获取枚举对象
    1.获得枚举对象,三种方式
        枚举对象在我们使用之前就已经全部创建好了,并且不会增加或减少,和声明的时候保持一致。
        
        例如:
        Gender g1 = Gender.FEMALE;
        Gender g2 = Gender.MALE;
        
        Gender g3 = Gender.valueOf("FEMALE");
        Gender g4 = Gender.valueOf("MALE");
        
        System.out.println(g1 == g3);//true
        System.out.println(g2 == g4);//true
        
        Gender g5 = Enum.valueOf(Gender.class, "FEMALE");
        Gender g6 = Enum.valueOf(Gender.class, "MALE");
        System.out.println(g1 == g5);//true
        System.out.println(g2 == g6);//true


    2.获得一个枚举类型的所有对象
        Gender[] values = Gender.values();
        for(Gender g:values){
            System.out.println(g);
        }

3)枚举类型的方法
    枚举对象默认只能调用到父类Enum中的方法以及Object中的方法

    如果想调用自己的方法,也可以在枚举类型中定义出属于自己的方法.
    注:枚举也是类,只是一种特殊的类而且,所以在枚举类型中可以定义很多东西,像之前在类中写代码是一样的
    例如:
    public enum Gender {
        MALE,FEMALE;
        
        public void say(String name){
            System.out.println("hello "+name+","+this);
        }
        public static void main(String[] args) {
            Gender g1 = Gender.FEMALE;
            Gender g2 = Gender.MALE;
            
            g1.say("tom");
            g2.say("tom");
        }
    }

    也可以定义静态方法
    例如:
    public enum Gender {
        MALE,FEMALE;
        
        public void say(String name){
            System.out.println("hello "+name+","+this);
        }
        public static void run(){
            System.out.println("running..");
        }
        public static void main(String[] args) {
            Gender.run();
        }
    }

4)枚举类型的属性
    枚举类型中可以定义属于自己的属性
    例如:
    public enum Gender {
        MALE,FEMALE;
        
        private String name;
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        //重写toString方法
        public String toString() {
            return this.getName();
        }
        public static void main(String[] args) {
            Gender g = Gender.FEMALE;
            g.setName("女");
            System.out.println(g);
        }
    }


5)枚举类型的构造器
    在枚举类型中定义其构造器,但是必须是私有的,默认也是私有的
    例如:
    public enum Gender {
        //默认调用无参构造器
        MALE,FEMALE;
        
        private String name;
        
        //有参构造器
        private Gender(String name){
            this.name = name;
        }
        //无参构造器
        Gender(){
            
        }
        
        //重写toString方法
        public String toString() {
            return this.name;
        }
    }

    构造器的调用:
    在声明枚举对象的时候,其实就是在调用构造器,默认是隐式调用其无参构造器,也可以显式调用有参构造器
    例如:
    public enum Gender {
        MALE("男"),FEMALE("女");
        
        private String name;
        private Gender(String name){
            this.name = name;
        }
        Gender(){
            this("");
        }
        public String toString() {
            return this.name;
        }
        public static void main(String[] args) {
            Gender g = Gender.FEMALE;
            System.out.println(g);
        }
    }


6)枚举类型的抽象方法
    枚举类型中可以编写抽象方法,但是这时候其每个对象都必须去实现这个抽象方法,否则编译报错。

    形式上很像匿名内部类对象
    例如:
    public enum Gender {
        MALE(){
            public void run() {
                System.out.println("MALE run");
            }
        },FEMALE(){
            public void run() {
                System.out.println("FEMALE run");
            }
        };
        
        public abstract void run();
    }


7)枚举类型可以实现接口
    枚举类型不能指定继承其他父类,但是可以实现其他接口

    例如:枚举类型中把该接口中的所有方法实现了
    public interface Action{
        void doSomeThing();
    }

    public enum Gender implements Action{
        MALE,FEMALE;

        public void doSomeThing() {
            System.out.println("Gender go..");
        }
    }

    例如:或者在每个对象中分别实现接口中所有方法也可以
    public interface Action{
        void doSomeThing();
    }
    public enum Gender implements Action{
        MALE(){
            public void doSomeThing() {
                System.out.println("MALE go...");
            }
        },FEMALE(){
            public void doSomeThing() {
                System.out.println("FEMALE go...");
            }
        };
    }
 

猜你喜欢

转载自blog.csdn.net/bifuguo/article/details/81748102