java基础-枚举类型
以下为本人的学习笔记
-
枚举不是类,是跟类,接口同级别的类型,
-
枚举就是限制某个类型的变量的取值只能为诺干个固定值中的一个,否则编译器就会报错;
-
枚举可以让编译器在编译时就可以控制源程序赋给的非法值,使用普通变量的方式在开发阶段无法实现这一目标
-
在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 implements Info{
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();
}
最后,枚举更符合我们设计的要求,但是枚举总归是一种类型,因此它占用的内存空间会更大一些。
7.面试题:
1、枚举类的理解?
当需要定义一组常量时,强烈建议使用枚举类。
若枚举只有一个对象,则可以作为一种单例模式的实现方式。
2、枚举类的创建方式?
JDK1.5之前需要自定义枚举类;
JDK1.5新增的 enum 关键字用于定义枚举类;
3、枚举类的特征?
1、私有化类的构造器,保证不能在类的外部创建其对象;
2、在类的内部创建枚举类的实例。声明为:public static final;
3、对象如果有实例变量,应该声明为private final,并在构造器中初始化;
注:enum声明的枚举类和class声明的枚举类,基本类似,唯独声明枚举类对象的语法简洁;
4、enum关键字的作用?
首先,enum声明实际上定义了一个类。因此我们可以通过定义的enum调用其方法。
其次,Java编译器会自动在enum类型中插入一些方法,其中就包括values()——所以我们的程序在没编译的时候,自然没法查看values()方法的源码了。
5、使用enum关键字定义的枚举类实现接口?
若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。
若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法。
■免责申明
⒈ 本站是纯粹个人学习网站,与朋友交流共赏,不存在任何商业目的。
⒉ 本站利用了部分网络资源,版权归原作者及网站所有,如果您对本站所载文章及作品版权的归属存有异议,请立即通知我们,我们将在第一时间予以删除,同时向你表示歉意!