Java学习笔记之Enum枚举(1)
Java学习笔记之Enum枚举(1)
前言
这是在学习Java过程中对自己遇到并得以解决的问题的一些记录,一方面是记录下来方便自己以后查询,一方面希望能帮到有同样疑惑的初学者!本文章参考了博主山高人为峰的文章和java官方文档(我使用的JavaSE8)并结合了自己的心路历程。
最基本的用法
在认识到Enum同样是一个标准Java类之前我们可以把枚举当成是一个和C语言中枚举一样的数据类型,只需要加上Java中的标识符private即可。举例:
import java.util.*
//enum声明与使用范例1
//声明
public enum Size
{
//这里的分号可以省略不写,也可以加上
SMALL,MEDIUM.LARGE
}
//使用已经定义的枚举创建一个新域
Size size_1 = Size.SAMLL;
Size size_2 = Size.LARGE;
//判断两个域是否相等
if(size_1 == size_2){ }
//打印到控制台,会输出字符串“STRING"
System.out.println(size_1);
到目前为止这跟C中的枚举没有任何区别。
了解Java中的Enum
首先查阅javadoc发现Enum 的声明为:
public abstract class Enum<E extends Enum<E>>;
也就是说首先Enum是一个标准类,它被标记为abstract 这意味着任何Enum不能实例化。也意味着我们自己声明的时候的语法等效于:
public final class Size extends java.lang.Enum;
但是当我继续看Core Java时候发现后面出现了一个很有意思的代码片
public enum Size
{
//后面还有别的域和方法时候必须带分号,且实例声明必须放在最前
SMALL("S"),MEDIUM("M").LARGE("L");
private String abbreviation;
private Level(String abbreviation){ this.abbreviation = abbreviation; }
public String getAbbreviation()
{
return abbreviation;
}
}
这段代码着实让我感到非常迷惑,我既不知道为什么SMALL后面还能打个括号带个字符串,也不知道后面定义的private域abbreviation和私有构造器有什么用。但是当我写出下列测试代码:
Size size = Size.SMALL;
System.out.println(size.getAbbreviation());
发现控制台输出了S,这就有意思了,这说明构造器的abbreviation跟SMALL后面括号里的内容是一样的,而且当我准备把构造器的修饰符修改为public时IDE报错,这时候我有点明白了前面的SMALL、MEDIUM、LARGE在java语法中是省略了写法的静态实例!在参考了Java文档和一些讲解之后我发现这里的SMALL应该是:
//这个语句实际上是通不过编译的,因为枚举不能被实例化,这只是用于说明发生了什么
public static final Size SMALL = new Size("S");
当你声明如下域时
Size size = Size.SMALL;
实际上是在把enum类中静态域的引用给了size,这也解释了为什么上面判断两个枚举是否相等时使用 == 运算符,因为只需要判断是否是同一个引用。那么很自然的我们还可以添加更多域和方法:
public enum Size
{
//后面还有别的域和方法时候必须带分号,且实例声明必须放在最前
SMALL("S",1),MEDIUM("M",2).LARGE("L",3);
private String abbreviation;
private int index;
private Level(String abbreviation,int index)
{
this.abbreviation = abbreviation;
this.index = index;
}
public String getAbbreviation()
{
return abbreviation;
}
public int getIndex()
{
return index;
}
}
在有了自定义域之后我们可以重写toString() 语法来提供关于这个枚举的更多信息:
@override
public String toString()
{
return String.format("name:%s,index:%d",getAbbreviation(),getIndex());
}
同时Enum类提供了一个**valueOf()**方法用于初始化枚举,用法如下:
//第一个参数是你自己定义的枚举的class,第二个参数是对应的域的名称
Size size = Enum.valueOf(Size.class,"SMALL");
//等效于
Size size = Size.SMALL;
后记
第一次在CSDN写博客,文字比较凌乱,算是记录学习的心路历程!希望能对同样有困惑搜索而来的你有所帮助!