Java 枚举与类的区别

定义:

枚举是指一组固定常量组成合法值的类型

首先是固定常量,一组有限常量集,比如一年的四个季节,太阳系的行星。其次,枚举是一种特殊的类型,定义了自己的一些规则,这些规则是建立在类规则之上的,是一种 type。

性质:

枚举是真正的 final,客户端不允许创建枚举类的实例,也不能对其进行拓展

Java 枚举本质上是 int 值。只能通过公有的静态 final 域为枚举类导出实例。

public enum Color {
    GREEN,RED,BLUE,GRAY;
}
  • 1
  • 2
  • 3
  • 4

实际上枚举的完整的结构为:

public enum Color {
    GREEN,RED,BLUE,GRAY;
    Color() {
    }
  • 1
  • 2
  • 3
  • 4
  • 5

如果在 Color() 构造方法之前加上 private 则不会有任何问题。如果加上 public 等修饰符,IDE 会报错,也就是编译器不会通过。其实这是枚举与类的根本区别,就在于构造方法私有。

当然如果仅仅是构造方法私有,不再提供构造方法了,也就是说外界不能 new 实例,如果仅从这样看,那枚举就没有什么用了。 
其实我们用过枚举的都知道,GREEN、RED 都是 Color 型的实例,其实枚举也可以看作自动处理了一些东西,帮助简化了代码,翻译成类大致就是:==================================================

public class Color {

    public static final Color GREEN = new Color(),
            RED = new Color(),
            BLUE = new Color(),
            GRAY = new Color();

    private Color() {
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

如果从这种角度去看,枚举的用法就不难理解了,也就是枚举类不给外界实例化的机会,只能它自己实例化,而一个枚举类的所有实例就只有枚举前面分号前的那几个,其他地方不允许创建。

既然前面说了枚举把构造方法私有化了,默认的分号前面的都自动 new 出实例了,然后枚举和一般的类用法上也就没别的太大的区别了。比如枚举里声明一个抽象方法,前面的每个实例就必须要实现,代码:

public enum Color {
    GREEN {
        @Override
        void draw() {

        }
    },RED {
        @Override
        void draw() {

        }
    },BLUE {
        @Override
        void draw() {

        }
    },GRAY {
        @Override
        void draw() {

        }
    };
    Color() {
    }
    abstract void draw();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

如果要实现一个接口:

public interface IDarw {
   void draw();
}
  • 1
  • 2
  • 3
  • 4

枚举:

public enum Color implements IDarw {
    GREEN {
        @Override
        public void draw() {

        }
    },
    RED {
        @Override
        public void draw() {

        }
    },
    BLUE {
        @Override
        public void draw() {

        }
    },
    GRAY {
        @Override
        public void draw() {

        }
    };

    Color(){}

}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

其实只要知道枚举翻译成类的样子,这些用法就很好懂了。 
然后比如声明什么变量,或者构造方法加参数,或者加一些方法,都和类用法一样。前面几个是实例,写在枚举类里面的的就相当于类的代码,有抽象方法就要在实例里实现一下,就这么简单。其他的用法也就是类和实例的关系,没什么特别了。

SO EASY !!!

猜你喜欢

转载自blog.csdn.net/x_san3/article/details/80086745
今日推荐