java基础-枚举类型

以下为本人的学习笔记

 

1.认识枚举

  • 枚举不是类,是跟类,接口同级别的类型,

  • 枚举就是限制某个类型的变量的取值只能为诺干个固定值中的一个,否则编译器就会报错;

  • 枚举可以让编译器在编译时就可以控制源程序赋给的非法值,使用普通变量的方式在开发阶段无法实现这一目标

  • 在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关键字定义的枚举类实现接口?

若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。

若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法。

 

■免责申明
⒈ 本站是纯粹个人学习网站,与朋友交流共赏,不存在任何商业目的。
⒉ 本站利用了部分网络资源,版权归原作者及网站所有,如果您对本站所载文章及作品版权的归属存有异议,请立即通知我们,我们将在第一时间予以删除,同时向你表示歉意!

 

posted @ 2022-10-28 17:27  逝去の年华  阅读(278)  评论(0编辑  收藏  举报