zoukankan      html  css  js  c++  java
  • 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));
    	}
    }
    
  • 相关阅读:
    ES6的Iterator,jquery Fn
    html4,xhtml,html5发展历史
    浏览器Range,Selection等选中文本对象
    高效的插入子节点DocumentFragment
    Vue 性能优化track-by
    JS中先有Object还是先有Function?
    Unicode 与(UTF-8,UTF-16,UTF-32,UCS-2)
    FormData、Blob、File、ArrayBuffer数据类型
    jQuery 2.0.3 源码分析 事件绑定
    记录:springmvc + mybatis + maven 搭建配置流程
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664846.html
Copyright © 2011-2022 走看看