在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱、增强for循环、枚举、泛型等。所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供对应的指令集来处理它。
下面要介绍的是枚举这个语法糖的原理。
其实enum就是一个普通的类,它继承自java.lang.Enum类。
public enum Sex { MALE, FEMALE }
public final class Sex extends java.lang.Enum{ public static final Sex MALE; public static final Sex FEMALE; public static Sex[] values(); public static Sex valueOf(java.lang.String) static {}; }
可以看出Sex编译成class文件之后,就变成发一个类,这个类是final的,所以enum是不可以被其他类继承的。由于enum已经继承了java.lang.Enum,所以enum不能再继承其他类。其中,enum中的每个枚举实例都是它自己的一个常量实例。除了这些,编译器还为我们生成了一个values方法。
下面再用DJ把这个enum的class文件反编译,看一下每个方法里面都做了些什么东西。
public final class Sex extends Enum { public static Sex[] values() { return (Sex[])$VALUES.clone(); } public static Sex valueOf(String s) { return (Sex)Enum.valueOf(Sex, s); } private Sex(String s, int i) { super(s, i); } public static final Sex MALE; public static final Sex FEMALE; private static final Sex $VALUES[]; static { MALE = new Sex("MALE", 0); FEMALE = new Sex("FEMALE", 1); $VALUES = (new Sex[] { MALE, FEMALE }); } }
在static块中初始化了两个enum实例,Sex枚举的构造方法有两个参数,第一个参数是枚举实例的名字,第二个参数是序列号(用ordinal方法可以获取到)。
我们还可以向每个枚举实例添加方法。
public enum Sex { MALE { public String toString() { return "我是男人"; } }, FEMALE { public String toString() { return "我是女人"; } }; }
那这种情况下,编译器又为我们做了些什么动作呢?编译这个文件之后,我们可以看到生成了三个class文件,分别是Sex.class、Sex$1.class、Sex$2.class。它们分别是些什么东东,别急,我们用“神器”DJ打开这些文件来看一下。
public class Sex extends Enum { public static Sex[] values() { return (Sex[])$VALUES.clone(); } public static Sex valueOf(String s) { return (Sex)Enum.valueOf(Sex, s); } private Sex(String s, int i) { super(s, i); } public static void main(String args[]) { } public static final Sex MALE; public static final Sex FEMALE; private static final Sex $VALUES[]; static { MALE = new Sex("MALE", 0) { public String toString() { return "\u6211\u662F\u7537\u4EBA"; } } ; FEMALE = new Sex("FEMALE", 1) { public String toString() { return "\u6211\u662F\u5973\u4EBA"; } } ; $VALUES = (new Sex[] { MALE, FEMALE }); } }
跟上面生成的class文件差不多,只是在static块中两个枚举实例的初始化变成了匿名内部类(这也就是为什么会多了两个class文件的原因了,^_^),在每个匿名内部类都有一个toString方法。
相关推荐
Java 语法糖详解 在编程世界中,语法糖(Syntactic Sugar)是一种设计语言时引入的特性,它不增加新的功能,而是提供更简洁、更易读的语法,使得编写代码更为方便。这一概念由Peter J. Landin提出,自那时以来,许多...
- **语法**:`javac filename.java` - **示例**:`javac MyClass.java` 3. **运行程序**: - **语法**:`java filename` - **示例**:`java MyClass` 4. **查看输出**:程序的输出将在命令行显示。 #### 三、...
【深入Java虚拟机(6)】Java语法糖编程开发技术共3页.pdf 在Java编程领域,Java虚拟机(JVM)是核心组件之一,它为Java程序提供了跨平台的运行环境。本资料主要探讨了Java语法糖的相关技术,这是Java语言的一个...
15. **枚举类型**:Java中的特殊类,用于表示固定数量的值,提供了更安全的替代常量。 16. **注解(Annotation)**:元数据的一种形式,可以用于提供编译器或运行时系统的信息。 17. **模块系统(Jigsaw项目)**:...
这份“Java语法帮助文档-中文加英文手册.rar”压缩包包含了详细的Java查询资料,旨在为开发者提供日常开发中的问题解决方案,无论是初学者还是经验丰富的程序员,都能从中受益。 文档主要分为中文版和英文版,确保...
1. **Java第02章 - 基本语法与数据类型**:这一章涵盖了Java语言的基础,包括变量声明、常量定义、数据类型(如整型、浮点型、字符型、布尔型)以及运算符的使用。同时,还介绍了流程控制语句,如if条件判断、for...
根据提供的文件信息,本文将对Java语法进行详细的解析与总结,包括基本的语法结构、关键字、数据类型、变量声明及转换等内容。 ### Java语言概述 Java是一种广泛使用的面向对象编程语言,由Sun Microsystems开发并...
8. **笔试.txt**:这很可能是包含Java基础问题的笔试题库,可能涵盖语法、类设计、异常处理、IO流、集合框架等多个方面,是检验和提升Java技能的有效工具。 通过这些文件,学习者可以全面回顾和实践Java的基础知识...
通过这些实例,开发者不仅可以加深对Java语法的理解,还能学习到如何解决实际问题。不断地实践和调试代码,是成长为一名优秀的Java程序员的必经之路。在学习过程中,务必关注每个例子的思路、设计模式以及最佳实践,...
在 Java 中,语法糖有很多种,例如泛型、自动拆箱和自动装箱、枚举、内部类、增强 for 循环、try-with-resources 语法、lambda 表达式等。这些语法糖都是 Java 编译器提供的,它们能够帮助我们减轻开发工作量,使...
包含java关键字、基本语法、Java标识符、Java修饰符、Java变量、Java枚举、继承。
2. **语法**:Java语法与C++类似,但更简化。它包含变量声明、控制结构(如if-else、for、while、switch)、方法定义、类和接口定义等。Java强制类型检查,所有变量必须先声明后使用。 3. **数据结构**:Java提供了...
3. **语法基础**:Java的基本语法包括数据类型(如整型、浮点型、字符型和布尔型)、变量、常量、运算符、流程控制(如if-else,switch,for,while循环),以及方法定义和调用。 4. **类与对象**:Java是面向对象...
2. **基础语法**:讲解Java的基本语法,如变量、数据类型、运算符、控制流语句(if-else、switch、循环)、方法和类的定义。 3. **面向对象编程**:深入探讨面向对象的基本概念,如封装、继承、多态性,以及抽象类...
3. **Java语法基础** - **数据类型**:Java有两类数据类型,基本类型(如int、char、boolean)和引用类型(如类、接口、数组)。 - **变量**:声明并初始化变量,理解其作用域和生命周期。 - **运算符**:包括...
首先,"Java programming documents"很可能包括了Java语言的基础教程,涵盖了从基本语法、数据类型到控制结构(如if语句和循环)、类和对象、封装、继承和多态等面向对象编程的核心概念。这些文档将帮助读者深入理解...
Java语法手册是编程者在学习或工作...以上只是Java语法手册中部分核心知识点的概述,实际手册会包含更多细节,如枚举、注解、并发工具类、集合框架的高级特性和JVM优化等内容,帮助开发者深入理解并熟练掌握Java编程。
《Core Java Volume I--Fundamentals》的第10版还涵盖了其他一些重要主题,如输入/输出流、枚举类型、泛型、Lambda表达式以及Java 8及以后版本的新特性。这本书以丰富的示例和清晰的解释,帮助读者构建坚实的Java...
内容可能涵盖了Java语法、数据类型、运算符、流程控制、方法、数组、字符串等基础内容,也可能涉及到更复杂的主题,如数据库连接、Swing图形用户界面设计等。 3. `JAVA复习题201003--.xls`:尽管文件名不完整,但...
7. **枚举**:Java 5引入的枚举类型,提高了常量集合的使用体验。 以上是对Java的概述和基本语法规则的详细介绍,对于初学者来说,理解和掌握这些基础知识是迈进Java世界的第一步。通过深入学习和实践,可以逐步...