面向对象通识21(枚举)

定义

枚举是实例数量已经固定的类

推论:枚举可以更好地实现单例模式

语法格式

  1. [public] abstract|final enum 枚举名(){
  2. //要在第一行列出所有的实例——以后就只使用这些实例
  3. //五大成员
  4. }

public修饰符可以没有,abstractfinal修饰符必然存在一个

枚举与普通类的语法区别

  • 枚举默认继承Enum这个类,枚举不能继承其他类
  • 枚举要么是final类,要么是abatract
    • 如果没有添加抽象方法,那系统默认该类为final
    • 如果有添加抽象方法,系统默认该类为abatract
    • 这两个修饰符为系统编译的时候自动添加,不允许开发者自行添加
  • 枚举类的构造器必然存在private修饰符,系统自动添加
  • 枚举不能创建对象,枚举固定了实例

其他的,与类基本相同

枚举的功能

  • 定义变量
  • 调用类方法或类变量

枚举的再带方法与switch调用枚举

定义枚举之后,枚举自动拥有如下方法

  • static 枚举名[] values():该方法返回所有的枚举实例;
  • static 枚举名 valueOf(String names):该方法根据枚举名返回枚举实例
  • String name():该方法返回枚举实例的名字
  • int Ordinal():该方法返回枚举实例的序号

switch表达式类型——int\short\byte\String\enum

举例:

  1. public enum Season {
  2. spring,summer,autumn,winter;
  3. public void info(){
  4. //this带表对象是season实例
  5. switch (this){
  6. case spring:
  7. System.out.println("Sp");
  8. break;
  9. case summer:
  10. System.out.println("Su");
  11. break;
  12. case autumn:
  13. System.out.println("Au");
  14. break;
  15. case winter:
  16. System.out.println("Wi");
  17. break;
  18. }
  19. }
  20. }
  1. public class SeasonTest {
  2. public static void main(String[] args) {
  3. //对于枚举,直接用已有的实例赋值
  4. Season s1=Season.spring;
  5. System.out.println(s1.name());
  6. System.out.println(s1.ordinal());
  7. Season[] ss=Season.values();
  8. for (Season s2:ss){
  9. System.out.println(s2);
  10. }
  11. String str="summer";
  12. //根据字符串名称返回对应的枚举实例
  13. Season s3=Season.valueOf(str);
  14. s3.info();
  15. }
  16. }

枚举定义构造器

枚举类的第一行是创建并列出枚举类的所有实例——因此需要构造器来传入对应的参数

  1. public enum Orientation {
  2. //枚举的第一行并不仅仅是简单的列出枚举实例
  3. //实际上是四个public static final修饰的常量
  4. //最终目的是创建并列出所有枚举类的所有实例
  5. NORTH("北"),SOUTH,WEST("西"),EAST("东");
  6. //调用无参构造器与调用String参数的构造器
  7. private String desc;
  8. Orientation(String desc){
  9. this.desc=desc;
  10. }
  11. Orientation(){
  12. }//构造器重载
  13. @Override
  14. public String toString(){
  15. return "Orientation[desc="+this.desc+"]";
  16. }
  17. }
  1. public class OrientationTest {
  2. public static void main(String[] args) {
  3. Orientation o1=Orientation.NORTH;
  4. System.out.println(o1);
  5. }
  6. }
  7. /*
  8. Orientation[desc=北]
  9. */

抽象枚举和实现接口的枚举

  • 枚举要求在第一行创建并且列出所有的枚举实例
  • 但抽象类不能创建实例

——矛盾!

得出浅层结论:枚举不能是抽象类

实现抽象枚举

(见前文)如果枚举内含有抽象方法,系统会自动给枚举添加修饰符abstract

此时需要使用匿名内部类在枚举的第一行创建枚举实例

如果调用了有参数的构造器,匿名内部类的参数要与之对应

枚举可以是抽象的!

  1. public enum Sex {
  2. MALE("man"){
  3. //匿名内部类的类体
  4. @Override
  5. public void info(){
  6. System.out.println("理性");
  7. }
  8. },
  9. FAMALE("woman"){
  10. //匿名内部类的类体
  11. @Override
  12. public void info(){
  13. System.out.println("非理性");
  14. }
  15. };
  16. abstract void info();
  17. private String dec;
  18. private Sex(String dec){
  19. this.dec=dec;
  20. }
  21. }