Java基础知识之枚举及相关面试题

一.枚举的定义:
枚举是从Java5开始提供的一种新的数据类型,是一个特殊的类,就是固定的多个常量对象的集合.
定义格式:
[修饰符] enum 枚举类名
{
常量A,常量B,常量C;s
}
我们自定义的枚举类型,在编译(在底层)都是直接继承于java.lang.Enum类的,Enum是所有枚举的父类

二.枚举和普通类的等价关系:
在这里插入图片描述
三.反编译之后的枚举类:
在这里插入图片描述
四.枚举类的特点:
①枚举的直接父类java.lang.Enum,但是不能显示继承Enum。
②枚举就相当于一个类,可以定义构造方法、成员变量、普通方法和抽象方法。
③默认私有的造方法,即不写访问权限也是private((假构造器,底层没有无参数构造器)。
④每个实例分别用一个全局常量表示,枚举类的对象是固定的,实例个数有限,不能使用new关键字。
⑤枚举实例必须位于枚举体中的最开始部分,枚举实例列表的后要有分号与其他成员分隔。
⑥枚举实例后有花括号时,该实例是枚举类的匿名内部类对象.

五.枚举的使用:
1):枚举中都是全局公共的静态常量,可以直接使用枚举类名调用.
Weekday day = Weekday.SATURDAY;
2):因为java.lang.Enum类是所有枚举类的父类,所以所有的枚举对象可以调用Enum类中的方法.
String name = 枚举对象.name(); //返回枚举对象的常量名称
int ordinal = 枚举对象.ordinal();//返回枚举对象的序号,从0开始.
String str = 枚举对象.toString():返回 枚举对象的常量名称
3):编译器生成的枚举类的静态方法(从反编译代码中):
枚举类型[] values();
Weekday[] ws = Weekday.values();:返回当前枚举类型所有的常量,使用一个数组封装起来.
枚举类型 valueof(String name);
Weekday day = Weekday.valueOf(“MONDAY”);//把一个指定名称字符串转换为当前枚举类中同名的常量.
4):从java5开始出现枚举,switch也支持操作枚举类型.
switch只支持int类型,支持枚举是因为底层使用的枚举对象的ordinal,而ordinal的类型依然是int类型.(如下图)
在这里插入图片描述
5):使用枚举类做单例模式:
(最佳的单例实现模式就是枚举模式。利用枚举的特性,让JVM来帮我们保证线程安全和单一实例的问题。除此之外,写法还特别简单。)

public enum Singleton {
    INSTANCE;
    public void doSomething() {
        System.out.println("doSomething");
    }
}

调用方法:

public class Main {
    public static void main(String[] args) {
        Singleton.INSTANCE.doSomething();
    }
}

直接通过Singleton.INSTANCE.doSomething()的方式调用即可。方便、简洁又安全。

发布了99 篇原创文章 · 获赞 2 · 访问量 2627

猜你喜欢

转载自blog.csdn.net/weixin_41588751/article/details/105107101