• Java学习笔记-枚举类


    实例有限且固定的类成为枚举类

    枚举类的实现

    • 早期时候的实现形式:
    public static final int SEASON_SPRING = 1;
    public static final int SEASON_SUMMER = 2;
    public static final int SEASON_FAIL = 3;
    public static final int SEASON_WINTER = 4;
    
    • 这种方式虽然实现简单,但存在很多问题:
      ①类型不安全(二者可运算)
      ②没有命名空间
      ③打印输出的意义不明确

    如今的枚举实现:

    • Java5以后增加了enum关键字(与class、interface地位相同)来定义枚举。可以拥有成员变量、方法,可以实现一个或多个接口,也可定义构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同
    • 枚举类与普通类的区别:
      • 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
      • 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
      • 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private
      • 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远不能产生实例
    • 枚举类默认提供了一个value()方法,该方法可以很便捷的遍历所有的枚举值
    public enum SeasonEnum{
    	SPRING,SUMMER,FAIL,WINTER;
    }
    
    • 在使用时候可以这样:SeasonEnum.SPRING。在switch使用时可直接用SPRING
    • java.lang.Enum类提供了以下方法:
      • int compareTo (E o):该方法用于与指定枚举对象比较顺序,同一个枚举实例只能和相同类型的枚举实例进行比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;如果该枚举对象位于指定枚举对象之前,则返回负数,否则返回零
      • String name():返回枚举实例的名称
      • int ordinal():返回枚举值在枚举类中的索引值
      • String toString():返回枚举常量的名称
      • public static <T extends Enum<T>>T valueOf(Class<T> enumType,String name):返回指定枚举类中指定名称的枚举值

    枚举类的成员变量、方法和构造函数

    public enum Gender {
    	MALE,FEMALE;
    	// 定义一个public修饰的实例变量
    	public String name;
    }
    
    public enum Gender{
    	MALE,FEMALE;
    	private String name;
    	public void setName(String name){
    		switch (this){
    			case MALE:
    				if (name.equals("男")){
    					this.name = name;
    				}else{
    					System.out.println("参数错误");
    					return;
    				}
    				break;
    			case FEMALE:
    				if (name.equals("女")){
    					this.name = name;
    				}else{
    					System.out.println("参数错误");
    					return;
    				}
    				break;
    		}
    	}
    	public String getName(){
    		return this.name;
    	}
    }
    
    public enum Gender{
    	// 此处的枚举值必须调用对应构造器来创建
    	MALE("男"),FEMALE("女");
    	private final String name;
    	// 枚举类的构造器只能使用private修饰
    	private Gender(String name){
    		this.name = name;
    	}
    	public String getName(){
    		return this.name;
    	}
    }
    
    • 其实也就相当于以下代码:
    public static final Gender MALE = new Gender("男");
    public static final Gender FEMALE = new Gender("女");
    

    实现接口的枚举类

    public enum Gender implements GenderDesc{
    	// 此处的枚举值必须调用对应构造器来创建
    	MALE("男")
    	// 花括号部分实际上是一个类体部分
    	{
    		public void info(){
    			System.out.println("这个枚举值代表男性");
    		}
    	},
    	FEMALE("女"){
    		public void info(){
    			System.out.println("这个枚举值代表女性");
    		}
    	};
    	private final String name;
    	// 枚举类的构造器只能使用private修饰
    	private Gender(String name){
    		this.name = name;
    	}
    	public String getName(){
    		return this.name;
    	}
    	// 增加下面的info()方法,实现GenderDesc接口必须实现的方法
    	public void info(){
    		System.out.println("这是一个用于用于定义性别的枚举类");
    	}
    }
    
    • 以上就是由匿名子类实现的

    包含抽象方法的枚举类

    public enum Operation{
    	PLUS{
    		public double eval(double x , double y){
    			return x + y;
    		}
    	},
    	MINUS{
    		public double eval(double x , double y){
    			return x - y;
    		}
    	},
    	TIMES{
    		public double eval(double x , double y){
    			return x * y;
    		}
    	},
    	DIVIDE{
    		public double eval(double x , double y){
    			return x / y;
    		}
    	};
    	// 为枚举类定义一个抽象方法
    	// 这个抽象方法由不同的枚举值提供不同的实现
    	public abstract double eval(double x, double y);
    	public static void main(String[] args){
    		System.out.println(Operation.PLUS.eval(3, 4));
    		System.out.println(Operation.MINUS.eval(5, 4));
    		System.out.println(Operation.TIMES.eval(5, 4));
    		System.out.println(Operation.DIVIDE.eval(5, 4));
    	}
    }
    
  • 相关阅读:
    Ant 执行 exec cmd.exe 时路径包含空格的问题
    时区时差换算(GMT,UTC,PST,PDT)
    windows 共存多个位数不同的jdk时,eclipse的报错对应措施
    Windows下查询指定端口进程,并杀死
    关于windows的jdk
    第一阶段工作总结
    mac配置git mergetool为p4merge(2013笔记整理)
    ubuntu 14.04 安装压缩包版mysql
    关于微信公众号内嵌网页的几个meta标签
    关于js的keyCode
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664845.html
Copyright © 2020-2023  润新知