最近看到Enum类的时候,发现它的定义方法很特别。关于泛型的在学习我将在另外一篇中详细描述。
http://xielingjiang.iteye.com/admin/blogs/870101
public abstract class Enum<E extends Enum<E>>
这句话什么意思呢?想了半天,发现它的意思就是让Enum这个类里面具有访问Enum子类的class类的能力。比如
public final int compareTo(E o) {
这样它的所有子类就具有了compareTo方法,而且可以用这个方法的必须是自己同类。
当然我觉得Enum的定义开头有点绕,在自己把自己当作形参的情况下,完全可以写成:
public abstract class Enum<E extends Enum>
这样就清晰了,要不然就容易看成循环
好了,我试图继承这个abstract类,但是令我惊奇的是,无论如何我都不能让编译器通过。查资料也很少提及Enum类的继承,后来我得出结论,Enum类根本就不能被继承。让我火大的是尽然这样定义成抽象类,如果定义成final类我也无话可说,唉···,误导啊。
其实我要继承Enum的初衷是要实现枚举类型的树状结构,可惜这不行。
如果我要实现一些公共的枚举类型,我非要重复写代码不可。
比如我要定义个BaseEnum,这个BaseEnum里面有这么一个公共的属性,比如int id; String name;以及他们的get/set方法和enum构造方法。如果不能实现,那我没定义个具体的Enum,我都得写上这个公共属性值和方法定义。
真是没有天理啊。。。
经过一天的研究,enum的继承只能用类继承来模拟实现了。
我的实现如下:
定义个抽象类,并且把它的构造方法定义成protected
public abstract class BaseEnum {
protected int id;
protected String name;
protected BaseEnum(int id,String name){
this.id=id;
this.name=name;
}
}
为了能用==符号来比较,我把这个BaseEnum改装一下,如下:
public abstract class BaseEnum {
protected int id;
protected String name;
protected BaseEnum(int id,String name){
this.id=id;
this.name=name;
}
public int hashCode(){
return id;
}
public boolean equals(Object o){
if(id == (BaseEnum)o.id) return true;
else return false;
}
}
定义自己的枚举类型,它继承自上面的BaseEnum,然后把它的构造方法申明为private,这样就没有人能实例化这个类了。然后在这个类中实例化几个枚举值,值的类型是自己,而且是public static final的。如下:
public class MyEnum extends BaseEnum{
private MyEnum(int id, String name) {
super(id, name);
}
public static final MyEnum COLOR1=new MyEnum(1,"Red");
public static final MyEnum COLOR2=new MyEnum(2,"Red");
public static final MyEnum COLOR3=new MyEnum(3,"Red");
public static final MyEnum COLOR4=new MyEnum(4,"Red");
}
虽然有缺陷,每次继承的时候必须重复写private构造方法,但是毕竟是模拟的嘛。
还有,这个模拟的enum并不能实现switch,这个也是它的遗憾的地方,谁叫sun考虑不周呢。。。将就这用吧
分享到:
相关推荐
Java基础学习课件PPT是一套全面覆盖Java SE(标准版)基础知识的教育资源,适合初学者和希望巩固Java技能的开发者。这套课件旨在在一个月内帮助学习者掌握Java编程的核心概念,为深入学习和应用Java技术打下坚实的...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性,成为跨平台应用开发的首选语言。Java的基础部分主要包括...
以上只是Java基础的冰山一角,实际学习中还会涉及到枚举、注解、反射、IO流的高级用法、NIO、JVM内存模型、设计模式等多个主题。在实践中不断深入学习和练习,你将能够逐步掌握Java编程,并为更高级的技术打下坚实...
适用人群:适用于具有一定Java编程基础的学习者和开发者,特别推荐给希望深入了解Java核心技术的专业人士。 使用场景及目标:本文旨在提升读者对于Java中枚举和泛型的理解与应用能力,包括掌握如何高效地定义和使用...
1. **Java基础**:介绍Java语言的基本语法,如变量、数据类型、运算符、控制流程(条件语句、循环)、数组、字符串以及异常处理。这些基础知识是理解和编写任何Java程序的基石。 2. **面向对象编程**:深入讲解Java...
14. **枚举类型**:Java 5引入了枚举类型,用于定义一组固定的常量,提高了代码的可读性和安全性。 15. **泛型**:泛型是Java SE 5引入的新特性,允许在类、接口和方法中使用类型参数,增强了类型安全并减少了强制...
以上知识点构成了Java基础学习的重要组成部分,通过深入理解和实践这些内容,初学者可以逐步建立起坚实的Java编程基础。在学习过程中,结合实际项目练习和阅读相关文档,将有助于更好地理解和掌握这些知识。
### JAVA中的枚举类型2:高级特性 #### 概述 枚举类型是Java语言中一个非常实用且灵活的功能。通常情况下,我们将其用于表示一组固定的常量集合,如一周中的几天、颜色选项等。然而,Java中的枚举类型远不止于此。...
Java是一种广泛使用的面向对象编程语言...综上所述,理解Java的基本数据类型、数组和枚举类型是编写高效、可靠的面向对象程序的基础。通过熟练掌握这些概念,开发者可以更好地组织和管理程序的数据,并实现复杂的功能。
这个"java基础课程之一"的资源包显然旨在帮助学习者构建坚实的Java编程基础。在这个课程中,你将接触到一系列关键知识点,包括但不限于: 1. **Java环境配置**:首先,你需要安装JDK(Java Development Kit),并...
Java基础代码学习篇主要涵盖了Java SE(标准版)的基础知识,这是学习Java编程语言的必经之路。在Java SE中,我们通常会接触到以下几个核心概念和知识点: 1. **Java语法**:Java语言的语法结构严谨,包括变量声明...
"Java零基础学习至入门的笔记" JAVA 基础知识点 1. 对象、类、方法、实例变量的概念: - 对象是类的一个实例,有状态和行为。 - 类是一个模板,描述一类对象的行为和状态。 - 方法是行为,一个类可以有很多...
《Java基础案例教程(第2版)》是一本旨在...通过《Java基础案例教程(第2版)》的学习,学生不仅可以掌握Java编程的基本技能,还能通过实践案例提升问题解决能力,为后续的Java进阶学习和实际项目开发打下坚实的基础。
在Java入门阶段,学习者需要掌握Java基础语法、数据类型、流程控制、数组、面向对象、方法重载、封装、继承、多态、抽象类、接口、枚举、常用类、String、日期时间、集合类、泛型、注解、异常处理、多线程、IO流、...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和强大...总的来说,这份“Java基础教程PPT”涵盖了Java编程的基本要素,是初学者理想的自学资料,通过系统学习,可以为进一步的Java开发打下坚实的基础。
12. **枚举类型**:Java 5引入了枚举,用于定义一组固定的常量。 13. **泛型**:泛型允许在类、接口和方法中使用类型参数,增强了代码的类型安全性和重用性。 14. **Java SE (标准版)**:"老王java se"可能是指...
这份"Java基础ppt.zip"压缩包提供了一套完整的Java基础知识学习资源,专为初学者设计,旨在帮助那些对IT行业感兴趣的新手从零开始系统地掌握Java编程。 PPT中可能会涵盖以下关键知识点: 1. **Java简介**:解释...
Java基础教程完整版 Java基础教程完整版是JAVE_LOVER作者提供的一系列Java教程,总共包含18个章节,涵盖了JavaSE基本...Java基础教程完整版涵盖了JavaSE基本知识点、UML建模、单元测试等内容,是Java学习的不二之选。
"Java基础案例教程"是为初学者设计的教育资源,旨在帮助他们掌握Java编程的基础概念和实践技能。本教程出自知名教育机构黑马程序员,该机构以其深入浅出的教学方式和实用的案例著称。 在本教程中,你将学习到以下...