Java枚举-Android面试准备2019-1-30

枚举类的存在意义

在某些情况下,一个类的对象是有限而且固定的。比如季节类,它只有四个对象;再比如行星类,它只有八个对象。这种实例有限且固定的类,在Java里被叫做枚举类。

在早期代码中,会直接使用简单的静态常量来表示枚举(例如public static final int SEASON_SPRING = 1;),但存在如下几个问题:1.类型不安全(可以进行本毫无意义的运算且不会报错)2.没有命名空间(所以名称必须唯一,否则会报错)3.打印输出的意义不明(会打印出来int值)。所以枚举类就有了存在的必要。

枚举类

enum关键字(它与class、interface关键字地位相同)用以定义枚举类。枚举类是一种特殊的类,他一样可以有自己的成员变量、方法,可以实现一个或者多个接口,也可以定义自己的构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。

「在一个Java源文件当中可以有多个类,但只能有一个public类,而当这个类被修饰为public的话,源文件名必须要与此类名相同。一个Java源文件中包含多个类时,此时只能够有一个public类,因为Java程序的入口是main方法,所以被定为public的这个类里一定是含有main方法的类,而且该类的名称要和文件名一致,因为虚拟机开始要找main方法的。」

但枚举类终究不是普通类,它与普通类有如下简单区别:1.枚举类默认继承了java. lang.Enum类(java.lang.Enum类中包含多种方法,具体查阅文档),而不是默认继承Object类,因此枚举类不能显式继承其他父类,其中java.lang.Enum类实现了Serializable和Comparable两个接口。2.非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。3.枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰,如果强制指定访问控制符,则只能指定为private。4.枚举类的所有实例必须在枚举类的第一行显式列出(如例),否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无需显式添加。

枚举举例

枚举类默认提供了一个values方法,该方法可以很方便地遍历所有的枚举值。编译上面Java程序,将生成一个SeasonEnum.class文件,这表明枚举类是一个特殊的Java类。如果需要使用该枚举类的某个实例,则可使用Enumclass.variable的形式,如SeasonEnum.SPRING或者使用Enum类的静态方法来获取实例。枚举类的实例只能是枚举值,而不是随意地通过new来创建枚举类对象。

枚举类使用示例

枚举类的成员变量、方法和构造器

枚举类通常应该设计成不可变类,也就是说如果这个枚举类拥有成员变量的话,那么它的成员变量值不应该允许改变。因此建议将枚举类的成员变量都使用private final修饰。如果将所有的成员变量都使用了final修饰符来修饰,那么必须在构造器里为这些成员变量指定初始值,因此应该为枚举类显式定义带参数的构造器。一旦为枚举类显式定义了带参数的构造器,列出枚举值时就必须对应地传入参数。

带参枚举类构造器

在枚举类中列出枚举值时,实际上就是调用构造器创建枚举类对象,只是这里无须使用new关键字也无须显式调用构造器。前面列出枚举值时无须传入参数,甚至无须使用括号,仅仅是因为前面的枚举类包含无参数的构造器。不难看出,上面程序中第一行代码实际上等同于如下两行代码:public static final Gender MALE =  new Gender("男");public static final Gender FEMALE new Gender("女");

实现接口的枚举类

「接口的方法默认public abstract。」

枚举类实现接口与普通类实现接口完全一样。如果由枚举类来实现接口里的方法,则每个枚举值在调用该方法时都有相同的行为方式(因为方法体完全一样)。如果需要每个枚举值在调用该方法时呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法,每个枚举值提供不同的实现方式,从而让不同的枚举值调用该方法时具有不同的行为方式。

枚举类实现接口(不同枚举值方法实现不同)

此时当创建MALE和FEMALE枚举值时,并不是直接创建Gender枚举类的实例,而是相当于创建Gender枚举类的匿名子类的实例。花括号部分实际上是匿名内部类的类体部分。

非抽象枚举类默认使用final修饰(即不可以派生子类),但抽象枚举类(因为它实现了接口所以包含了接口的抽象方法但并没有实现抽象方法,所以是抽象枚举类)可以派生子类。

「一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里定义的全部抽象方法,否则该类将保留从父接口那里继承到的抽象方法,该类也必须定义成抽象类。」

编译上面的程序,可以看到生成了Gender.class、Gender$1.class和Gender$2.class三个文件,这样的三个class文件正好证明了上面的结论:MALE和FEMALE实际上是Gender匿名子类的实例,而不是Gender类的实例。当调用MALE和FEMALE两个枚举值的方法时,就会看到两个枚举值的方法表现不同的行为方式。

包含抽象方法的枚举类

即可以像上面所提的实现接口从而使枚举类变为抽象枚举类,进而实现不同枚举值的方法具有不同的行为方式,也可以直接在枚举类中定义抽象方法。

包含抽象方法的枚举类

编译上面程序会生成5个cass文件,其实Operation对应一个class文件,它的4个匿名内部子类分别各对应一个cass文件。枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(因为系统自动会为它添加abstract关键字),但因为枚举类需要显式创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容