以下为本人的学习笔记
-
枚举不是类,是跟类,接口同级别的类型,
-
枚举就是限制某个类型的变量的取值只能为诺干个固定值中的一个,否则编译器就会报错;
-
枚举可以让编译器在编译时就可以控制源程序赋给的非法值,使用普通变量的方式在开发阶段无法实现这一目标
-
在JDK1.5之后,使用关键字enum定义一种新的类型,称为枚举类型,枚举是列举出来,选其中的一个
-
枚举的本质是一个继承了Enum类的子类,JVM编译器把枚举编译后生成一个final class
2.枚举的关键字和方法
关键字:enum ,跟class,interface类似
public class EnumDemo{
public static final int RED = 0x1;
public static final int GREEN = 0x2;
public static final int BLUE = 0x3;
//public int color;//变量,可以随意赋值
public Color colorEnum;//Color是一个枚举类型
@Test
public void test1(){
//调用时用枚举类型名.对象名
colorEnum = Color.RED;
colorEnum = Color.BLUE;
colorEnum = Color.GREEN;
System.out.println(colorEnum);//输出(字符串):GREEN
//打印colorEnum实际上是打印colorEnum.name()
System.out.println(colorEnum.name());//输出:GREEN
System.out.println(colorEnum.ordinal());//ordinal序号,编号。输出:1
System.out.println(colorEnum.toString());//输出:GREEN
Color[] values = Color.values();//values()获取Color所有的值
System.out.println( Arrays.toString(values));//输出:[ RED,GREEN,BLUE]
}
}
//定义一个枚举类型
public enum Color{
//让color必须是RED ,GREEN,BLUE中的一个值
//下面三个,每一个都代表枚举的一个实例化对象,枚举类型的对象都是从枚举类型内部定义的,外部不能定义枚举对象
RED,GREEN,BLUE;
//写上一个对象,内部自动会调用Enum(String name,int ordinal),此构造方法不能被外部直接调用,只能被其子类访问,此构造方法为自动调用
}
3.集合对枚举的支持
在JDK1.5之后,对于Set和Map接口而言又增加了两个新的子类:EnumSet(抽象类)、EnumMap两个类(很少用)
@Test
public void test3(){
EnumSet<Color> set = EnumSet.allOf(Color.class);
for(Color c :set ){
System.out.println(c);//输出枚举类型Color的所有实例化对象
}
//key用枚举类型元素来表示
EnumMap<Color,String> map = new EnumMap<>(Color.class);
map.put(Color.RED,"red");
map.put(Color.GREEn,"green");
map.put(Color.BLUE,"blue");
}
4.带构造方法的枚举
通过对象去调用构造方法(但很少使用)
public enum Color{
//枚举对象后面没有加括号,表示调用无参构造方法
//枚举对象后面有加括号,表示调用有参构造方法
RED(10),GREEN(20),BLUE;
//可以定义属性
private int color;
private Color(){
System.out.println("无参构造器");
}
private Color(int color){
this.color = color;
System.out.println("有参构造器");
}
}
@Test
public void test4(){
System.out.println(Color.RED);//第一次使用枚举,枚举内部的三个对象的构造方法都会被调用
}
5.让枚举实现接口
public interface Info{
public int getColor();
}
public enum Color{
RED(10),GREEN(20),BLUE;
private int color;
private Color(){
System.out.println("无参构造器");
}
private Color(int color){
this.color = color;
System.out.println("有参构造器");
}
public int getColor(){
return color;
}
}
public void test5(){
System.out.println(Color.RED.getColor());
}
6.在枚举中定义抽象方法
public enum Color{
RED{
@Override
publci String getColor2(){
return "red";
}
},GREEN{
@Override
publci String getColor2(){
return "green";
}
},BLUE{
@Override
publci String getColor2(){
return "blue";
}
};
public abstract String getColor2();
}
使用枚举实现单例设计模式
public enum Singleton{
SINGLETON;
publci void method(){
System.out.println("method");
}
}
//使用枚举实现单例设计模式
@Test
public void test5(){
Singleton.SINGLETON.method();
}
最后,枚举更符合我们设计的要求,但是枚举总归是一种类型,因此它占用的内存空间会更大一些。
■免责申明
⒈ 本站是纯粹个人学习网站,与朋友交流共赏,不存在任何商业目的。
⒉ 本站利用了部分网络资源,版权归原作者及网站所有,如果您对本站所载文章及作品版权的归属存有异议,请立即通知我们,我们将在第一时间予以删除,同时向你表示歉意!