1、枚举类介绍

如果一个类的实例是有限且确定的,那么可以使用枚举类。比如:季节类,只有春夏秋冬四个实例。

枚举类使用enum进行创建,其实例必须从”第一行“开始显示写出。

enum Season{

SPRING,SUMMER,FALL,WINTER;//默认public static final,这都是Season类的对象。

}

特点:

1、枚举类的对象默认都是public static final

2、枚举类的构造器都是private,所以无法在外部创建其实例,这也决定了枚举类实例的个数的确定性(写了几个就是几个)。

3、enum类不可被继承。

4、enum类默认extends java.lang.Enum,所以无法再继承其他类

2、遇到的问题

enum类默认被final修饰的情况下,是无法有子类的。但是在《疯狂Java讲义》中是这么说的:

那么,问题来了:

enum Season{

// SPRING,SUMMER,FALL,WINTER;//默认public static final,这都是Season类的对象。

SPRING{

public void show(){

System.out.println("I'm Spring");

}

},SUMMER,FALL,WINTER;

private String name;

//构造器默认且只能是private

Season(){

System.out.println("Season run...");//运行四次

}

public void setName(){

//Java5开始,switch方法支持枚举类对象。

switch(this){

case SPRING:

name="春";

break;

case SUMMER:

name="夏";

break;

case FALL:

name="秋";

break;

case WINTER:

name="冬";

break;

}

}

public void setName1(String name){

this.name=name;

}

public String getName(){

return name;

}

public void show(){

System.out.println("I'm show");

}

}

运行结果:

问题:SPRING是Season匿名子类的对象,但是前面已经说明Season类是final的?

3、真相

1、当在enum类中创建匿名子类对象的时候,在运行时,会将Season编译为一个.class文件,没有final修饰:

同时对于匿名子类,会生成一个.class文件:

2、当enum类中没有匿名子类对象时,对应的class就是final的:

3、如果enum类中含有抽象方法,那么这个类就是抽象的:给出的对象必须实现抽象方法:

即便如此,还是无法继承该类:

可以看出,即便enum中有抽象方法,它也是被final修饰的,由于final 和abstract是不能同时出现的。所以我认为:枚举类实际上不存在final、abstract。只是规定不能被继承,final、abstract是对于运行时生成的对应class而言的。

结论:

1、enum类不存在final或者abstract的,就是不能被继承。如果像《疯狂Java讲义》中说的,非抽象枚举类默认是final的,那么应该可以显示用final修饰,但是不行:

所以说,enum本身不存在final、abstract的说法。就是不能被继承。运行时生成的class才有final、abstract的说法。

2、运行时,会生成对应的.class文件(可以理解为一个新的class类型的类)。

2.1、如果enum类中没有抽象方法,也没有匿名子类对象,那么这个类是被final修饰的。

2.2、如果enum类中有抽象方法,那么这个类是抽象的,对象必须实现该抽象方法。

2.3、如果enum类中没有抽象方法,但是有匿名子类对象,那么这个类不被final修饰,也不是抽象的。

java 枚举 被继承_enum不能被继承相关推荐

  1. java 枚举的继承_java中枚举类可以被继承吗?

    java 枚举类 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: ● 枚举类继承了java.lang.Enum类,而不是默认的Object类.而 ...

  2. java 注解 enum_13 Java枚举和注解

    Java枚举 在某些情况下,一个类的对象是有限而且固定的.例如季节类,只能有 4 个对象. 当类的对象是有限时,就应该使用枚举,而不使用普通类.(枚举对象是单例模式) 枚举的属性 实现接口的枚举类 例 ...

  3. [转载] java 枚举Enum源码解析

    参考链接: 使用Java枚举 应用场景 枚举是单例模式中的一种.面试官系统之设计模式(单例模式) 简单来讲就是只能实例化一次,线程安全且性能高.枚举通常用来列举一个类型的有限实例集合,我们可以使用常量 ...

  4. Java枚举类型(enum)详解

    文章目录 理解枚举类型 枚举的定义 枚举实现原理 枚举的常见方法 Enum抽象类常见方法 编译器生成的Values方法与ValueOf方法 枚举与Class对象 枚举的进阶用法 向enum类添加方法与 ...

  5. Java枚举(Enum)类型的基本介绍与原理探求

    Enum枚举类型 Enum的全写是Enumeration,这个词的翻译是列举.逐条陈述.细目.在程序语言中,枚举类型是一种特殊的数据类型(常用的数据类型比如字符串.整型),这种数据类型的变量值限定在固 ...

  6. java 枚举_深入理解Java枚举

    所有知识体系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收录,欢迎Star!再次感谢,愿你早日进入大厂! https:/ ...

  7. 深度学习Java枚举(enum)——枚举虽小,五脏俱全

    文章目录 深入理解Java枚举 一.什么是枚举 1.1 什么是枚举? 1.2 Java中的枚举类 二.Java枚举的语法 三.Java枚举类的使用规则和应用场景 3.1 Java枚举类的使用规则 3. ...

  8. java枚举类型有什么用_[转载] Java中枚举类型的使用 - enum

    本文转载自博客 - Java枚举类型, 博主对原文内容及结构作了一定的修改. 1 枚举类的编译特性 从JDK 5开始, Java中多了一个关键字 -- enum: 可以将一组具有名称的值(包括Stri ...

  9. java 枚举 get_Java枚举

    学习Java枚举 今天将要系统的学习一下java中的枚举,以便在以后开发的道路上能够更熟练的使用枚举类型. 关键字enum可以将一组具名的值的有限集合创建为一种新的类型.而这些具名的值可以作为常规的程 ...

最新文章

  1. Redis 16 大应用场景,竟然这么多。。
  2. springmvc+mybatis+ajax 批量插入数据
  3. 数据分析方法有哪些_数据分析方法
  4. python内存消耗大吗_如何减少python内存的消耗?
  5. [LeetCode] Valid Anagram
  6. 中国水性颜料市场趋势报告、技术动态创新及市场预测
  7. python 去掉双引号_python知识学习,python标识符和关键字
  8. Groovy模板引擎
  9. PYTHON之计算机语言基础知识 —— 字符编码
  10. java开源商城系统|代码哥如何用java小程序直播商城搭建直播带货平台技术解决方案
  11. 用Visual C#.NET编写服务器日期控件
  12. 支付网关路由之设计方案实战
  13. Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册
  14. vue-cli 脚手架安装
  15. stm32g474教程_杜洋老师:STM32教程,STM32视频教程
  16. 360极速浏览器用ie8模式打开网页(360浏览器同理)
  17. python版局域网端口扫描
  18. 随机算法 之随机数的产生
  19. 第8章第15节:制作企业宣传册的公司团队第二页面 [PowerPoint精美幻灯片实战教程]
  20. MT6737 Android N 平台 Audio系统学习----ALSA Driver

热门文章

  1. 不能往Windows Server 2008 R2 Server中复制文件的解决方法
  2. 手机连接投影机的步骤_投影机和电视机怎么选?看这一篇就够了!
  3. Framebuffer 画点,画线,画多边形,画圆
  4. linux注册硬盘中断,基于Linux底层硬盘中断辅助代码的分析与设计
  5. 图片缩放 算法 matlab,图像放大算法总结及MATLAB源程序.doc
  6. php html转化为pdf,PHP将html转换成PDF文件
  7. 音乐网站购买服务器,怎么样去做一个音乐网站
  8. 海康威视摄像头安装插件检测不到_海康威视摄像机常见问题解答
  9. 实战Transformer在NLP和医学图像分割领域的应用
  10. python【数据结构与算法】并查集引入