用最直接的大白话聊一聊,Java中的枚举类你真的理解了吗

思考一下:为什么需要枚举类?枚举类的产生背景是什么?

一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,比如成绩Grade只能为A、B、C、D、E其中的一种。类似的问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。

1.如何创建枚举类

JDK 5新增的 enum 关键字用于定义一个枚举类

一个枚举也有构造函数(但是枚举类的构造函数必须是私有的)、字段和方法

1.1定义枚举类的构造方法和字段

package com.cj.study.enumeration;

public enum Grade {

	A("90-100"),
	B("80-89"),
	C("70-79"),
	D("60-69"),
	E("0-59");
        //A、B、C、D、E每一个都代表该枚举类的一个的实例对象,
        //理解这句话很关键,可以参考下方注释掉的代码帮助理解
	
	private Grade(String value){
		this.value = value;
	}
	
	private String value;

	public String getValue() {
		return value;
	}
	
	
}

    //JDK1.5之前没枚举类时候的做法,
    //对枚举类真正含义的理解,可以参考下边的代码
    /*
        public static Grade A = new Grade("90-100"); //这就相当于上边的A("90-100"),
        public static Grade B = new Grade("80-89");//这就相当于上边的B("80-89"),
        public static Grade C = new Grade("70-79");//这就相当于上边的C("70-79"),
        public static Grade D = new Grade("60-69");//这就相当于上边的D("60-69"),
        public static Grade E = new Grade("0-59");//这就相当于上边的E("0-59");

        //构造函数私有化,不允许外界去new对象,只允许有ABCDE这几种
        private Grade(String value){
            this.value = value;
        }

        private String value;	
	
        public String getValue() {
	        return value;
        }
    
    */
package com.cj.study.enumeration;

public class Student {
	
	private String name;
	
	//成绩:只能是A、B、C、D、E其中的一个
	private Grade grade;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Grade getGrade() {
		return grade;
	}

	public void setGrade(Grade grade) {
		this.grade = grade;
	}
	

}
package com.cj.study.enumeration;

import org.junit.Test;

public class Demo1 {

	@Test
	public void test1(){
		Student s = new Student();
		s.setName("张三");
		s.setGrade(Grade.A);
		
		Grade g = s.getGrade();
		String v = g.getValue();
		System.out.println(v);
		
	}
	
}

1.2带抽象方法的枚举

package com.cj.study.enumeration;

public enum Grade {

	A("90-100"){
		public String toLocalString(){
			return "优秀";
		}
	},
	B("80-89"){
		public String toLocalString(){
			return "良好";
		}
	},
	C("70-79"){
		public String toLocalString(){
			return "一般";
		}
	},
	D("60-69"){
		public String toLocalString(){
			return "刚及格";
		}
	},
	E("0-59"){
		public String toLocalString(){
			return "不及格";
		}
	};//ABCDE代表着自身的一个个的实例对象
	
	private Grade(String value){
		this.value = value;
	}
	
	private String value;

	public String getValue() {
		return value;
	}
	
	public abstract String toLocalString();
	
}
    //上边的格式看起来不好理解,可以参考下方的理解
    /*
        public static Grade A = new Grade("90-100"){//匿名内部类实现抽象方法
		public String toLocaleString(){
			return "优秀";
		}
	};//这就相当于上边的A("90-100"),下边的BCDE和A一样,就不挨个儿写了
	public static Grade B = new Grade("80-89");//这就相当于上边的B("80-89"),
	public static Grade C = new Grade("70-79");//这就相当于上边的C("70-79"),
	public static Grade D = new Grade("60-69");//这就相当于上边的D("60-69"),
	public static Grade E = new Grade("0-59");//这就相当于上边的E("0-59");

 	private String value;	
	private Grade(String value){
		this.value = value;
	}
	
        public abstract String toLocaleString();

    */

2.总结一下枚举类有哪些特性?

1、枚举类也是Java类,不过形式有点特殊。

2、枚举类中声明的每一个枚举值代表枚举类的一个实例对象,而且这个实例对象是静态的,所以才可以直接Grade.A

理解这句话很关键。

3、与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的,这点不难理解,因为如果是公有的话,在外部就可以随便的去new了,那就失去枚举类本身的意义了,枚举本身的意义就在于数据不能是随意的,必须是列出来的一定范围内的值。

4、枚举类也可以实现接口、或继承抽象类。

5、JDK5中扩展了swith语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型。

6、若枚举类只有一个枚举值,则可以当作单态设计模式使用。

特别需要注意和理解的两点:

1、枚举类的构造函数必须为私有的

2、枚举类中声明的每一个枚举值都代表该枚举类的一个实例对象

如果面试中问枚举的话,这两点也是经常被问到的

因为这两点可以看出你对枚举类是否真的理解了

猜你喜欢

转载自blog.csdn.net/ju_362204801/article/details/90667356