java学习笔记57--枚举类型(enum)

Java枚举类型的特性与使用
本文介绍了Java中JDK1.5新增的枚举类型。阐述了枚举类型与类的关系,本质是类且默认final修饰、继承java.lang.Enum,构造器私有。还说明了获取枚举对象的方式,以及枚举类型的方法、属性、构造器、抽象方法等特性,同时指出枚举类型可实现接口。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值