转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45332565
一、前言
今天我们来讲讲枚举,希望通过这篇博客大家能对枚举有个更全面的了解。枚举是一种实例(大写)数固定的类(不能再创建实例),枚举改变了常量的声明方式,而且它在编译期间就限定了类型。枚举多用于确定的状态数(如:鼠标上下左右、IM消息已读未读)、类型数(如:系统、聊天、添加好友消息,我的他的)、模式数(回复、评论模式,刷选、全部模式)等等。枚举和类一样,同样有抽象类、可以实现接口、可含内部类、初始化块,值得注意的是:枚举的构造器无论是否使用private修饰,默认总是被private修饰;当然,枚举变量也可以在switch使用。下面我们通过实例来全面了解一下Java中的枚举。
二、实例说明
(1)实例演示
/** * 修饰符 enum 枚举名{ * //立即在第一行列出该枚举的所有实例(但实际上是创建枚举实例,会默认调用无参构造器)。 * } * * @author [*昨日重现*] lhy_ycu@163.com * @since version 1.0 * @datetime 2015年4月27日 下午8:36:44 */ public enum Gender { // MALE("男")相当于:Gender MALE = new Gender("男"); // 列出所有枚举值,也就是该枚举所有可能的实例--实例列表 // WOMENMALE其实默认就是WOMENMALE() MALE("男"), FEMALE("女"), MANMALE(), WOMENMALE; private String name; // --构造器无论是否使用private修饰,默认总是被private修饰 Gender() { System.out.println("无参构造方法被调用..."); } private Gender(String name) { System.out.println("含参构造方法被调用..." + name); this.name = name; } // 注意:初始化块只能被static修饰。 // 编译时实例初始化块的代码都会被提取到构造器的“最前面”,所以它执行的优先级高于构造器 { System.out.println("实例初始化块...."); } // 当类被加载后,对类初始化后时被隐式执行,且一个JVM对一个类只初始化一次。 static { System.out.println("静态/类初始化块..."); } public void info() { System.out.println(this + " 枚举中的info方法被调用"); } /** * 枚举在switch中的使用 --switch(byte/short/char/int/String/枚举) * * @param gender */ public static void chooseSex(Gender gender) { if (gender == null) { return; } switch (gender) {// 传一个枚举变量给switch case MALE: System.out.println("男性..."); break; case FEMALE: System.out.println("女性..."); break; case MANMALE: System.out.println("男同..."); break; case WOMENMALE: System.out.println("女同..."); break; default: break; } } class A { { System.out.println("A中实例初始化块..."); } public void info() { System.out.println(this + "A类中的info方法被调用"); } } public static void main(String[] args) { // 初始化块及构造器(无参或含参)按实例列表顺序挨个被执行,接着执行静态(类)初始化块 Gender g1 = Gender.MALE; Gender.chooseSex(g1); g1.info(); // 创建寄生类(内部类)实例 A a = g1.new A(); a.info(); // 打印该枚举变量g1所在的实例列表所在的位置,从0开始 System.out.println(g1.ordinal()); // Gender g2 = Gender.FEMALE; // System.out.println(g2.ordinal()); // 打印该枚举的所有实例 for (Gender g : Gender.values()) { System.out.println(g); } } }
========= 打印结果 =============
实例初始化块....
含参构造方法被调用...男
实例初始化块....
含参构造方法被调用...女
实例初始化块....
无参构造方法被调用...
实例初始化块....
无参构造方法被调用...
静态/类初始化块...
男性...
MALE 枚举中的info方法被调用
A中实例初始化块...
com.leo.enumation.Gender$A@c17164A类中的info方法被调用
0
MALE
FEMALE
MANMALE
WOMENMALE
实例初始化块....
含参构造方法被调用...男
实例初始化块....
含参构造方法被调用...女
实例初始化块....
无参构造方法被调用...
实例初始化块....
无参构造方法被调用...
静态/类初始化块...
男性...
MALE 枚举中的info方法被调用
A中实例初始化块...
com.leo.enumation.Gender$A@c17164A类中的info方法被调用
0
MALE
FEMALE
MANMALE
WOMENMALE
(2)下面看看抽象枚举的使用
// 编译器将把注解信息记录在class文件中,当运行Java程序时JVM会保留注解,因此可以通过反射机制来读取注解的信息。 @Retention(RetentionPolicy.RUNTIME) // 注解作用在类上面 @Target(ElementType.TYPE) public @interface ClassName { // 声明默认值 String name() default "计算"; // 特殊的值 String value(); }
/** * 利用抽象枚举来模拟一个四则运算,需要创建匿名内部类来重写相关抽象方法。 * * @author [*昨日重现*] lhy_ycu@163.com * @since version 1.0 * @datetime 2015年4月27日 下午10:14:02 */ // 指定用的是哪个自定义注解的类,若把name去掉,则name默认为:计算 @ClassName(name = "枚举", value = "四则运算") public enum Calculator { ADD("张三") { @Override public double eval(double x, double y) { return x + y; } }, SUB { @Override public double eval(double x, double y) { return x - y; } }, MULTIPLY { @Override public double eval(double x, double y) { return x * y; } }, DIVIDE { @Override public double eval(double x, double y) { if (y == 0) { throw new ArithmeticException("除数不能为0"); } return x / y; } }; private String name; private Calculator() { System.out.println("无参构造器被执行..." + this); } private Calculator(String name) { this.name = name; System.out.println("含参构造器被执行..." + this.name); } public abstract double eval(double x, double y); public static void main(String[] args) throws ClassNotFoundException { Calculator c1 = Calculator.ADD; System.out.println(c1.eval(1, 2)); // Calculator c2 = Calculator.SUB; // System.out.println(c2.eval(1, 2)); // 打印该枚举的一些注解信息 Class<?> clazz = Class.forName("com.leo.enumation.Calculator"); ClassName cn = clazz.getAnnotation(ClassName.class); System.out.println(cn.name() + " ," + cn.value()); } }
(3)枚举实现接口
interface IDirection { void pointDirection(); } /** * 枚举实现接口 * * @author [*昨日重现*] lhy_ycu@163.com * @since version 1.0 * @datetime 2015年4月27日 下午11:01:50 */ public enum Orientation implements IDirection { EAST, WEST, SOUTH(), NORTH; @Override public void pointDirection() { System.out.println("指向 ---> " + this); } public static void main(String[] args) { IDirection direction = Orientation.SOUTH; direction.pointDirection(); } }
三、总结
关于Java中的枚举相关知识点大体就这些了,后面讲陆续更新内部类、正则表示式、改善Java代码质量的一些建议等等,敬请关注!
相关推荐
Java学习系列(五):Java面向对象之抽象类、接口、内部类、枚举类详解 本章节主要讲解Java面向对象的其他概念,包括抽象类、接口、内部类、枚举类。抽象类是一种特殊的类,不能被实例化,用于定义一些公用的方法和...
Java面向对象基础与高级知识点详解 Java是一种广泛使用的面向对象编程语言,它的设计哲学是“一切皆对象”。本讲义将全面深入地介绍Java面向对象的基础概念和高级特性,帮助开发者从初学者到精通者逐步提升技能。 ...
根据提供的文件信息,我们可以归纳和解析出多个与Java面向对象编程相关的知识点,下面将逐一进行详细阐述。 ### 1. Switch 语句的理解 - **题目解析**:给出的示例代码展示了如何使用 `switch` 语句进行条件判断。...
《Java学习攻略详解》是一份详细的Java学习路径规划,适合初学者按照步骤进行系统性学习。内容从基础知识到进阶知识都有涉及,循序渐进地引导学习者掌握Java编程技能。下面将详细解读这份攻略中的各个知识点。 ### ...
其次,书中会深入探讨面向对象编程(OOP)的概念,这是Java语言的核心特性。OOP涉及类的继承、封装和多态性,通过实例解释如何设计和实现复杂的系统。此外,还会讲解如何使用异常处理来增强代码的健壮性,以及如何...
Java2编程详解主要涵盖Java语言的核心概念和技术,包括但不限于语法基础、面向对象编程、类与对象、接口与抽象类、异常处理、输入/输出(I/O)系统、集合框架、多线程、网络编程以及Java的高级特性。以下是对这些主题...
2. **面向对象编程**:Java是完全面向对象的语言,它支持类、对象、封装、继承、多态等面向对象特性。理解类和对象的概念,学会如何设计和实现类,以及掌握继承和多态的应用,对于编写可维护、可扩展的代码至关重要...
"Java核心基础技术卷详解" ...Java 核心基础技术卷涉及到 Java 的基础语法、面向对象、异常、泛型、IO、枚举、反射机制、集合、内部类等多方面的知识点,为 Java 开发者提供了一个全面的学习指南。
1. **Java语言基础**:从变量、数据类型、运算符、流程控制语句(如if-else、switch、for、while)到类、对象、封装、继承和多态等面向对象编程的基本概念。 2. **集合框架**:Java集合框架是处理对象数组的重要...
2. **类与对象**:阐述面向对象编程的基本原理,包括类的定义、对象的创建与销毁、封装、继承和多态等概念。 3. **数组与集合框架**:介绍如何使用数组存储和操作数据,并深入探讨Java的集合框架,如ArrayList、...
000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...
面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 ...
本书讲解Java程序设计知识及其编程方法,包括Java语言的基础语法、结构化程序设计、面向对象程序设计、数组、字符串、向量、哈希表、泛型、枚举、异常处理、文件和数据流、图形用户界面设计、小应用程序、线程、编程...
11. **二维数组创建**:在Java中,创建一个长度为3的二维数组应写作`new int[3][]`,这意味着创建了一个包含3个引用的数组,每个引用可以指向一个长度任意的一维数组。 12. **Java语言类型**:Java是一种高级编程...
Java语言面向对象编程思想之类与对象实例详解 Java语言面向对象编程思想中,类和对象是两个核心概念。类是对对象的抽象描述,它定义了对象的属性和行为;对象是类的实例化,它具有类的所有属性和行为。下面是对类和...
Java中的枚举提供了一种安全、可维护的方式来表示一组固定数量的常量,它们可以拥有方法和属性,支持遍历、switch语句等操作,同时具有面向对象的特性。枚举在处理固定选项、状态机、权限控制等场景中非常有用,是...
Java 5 引入的枚举类型(enum)是面向对象编程中的一种重要特性,它为表示一组固定值提供了类型安全且强大的方式。在本文中,我们将深入探讨枚举类的概念、用法以及其与传统常量定义的区别。 1. 枚举类的定义与常量...
- 枚举可以与继承、多态等其他面向对象特性结合使用。 - 示例代码: ```java enum Shape { CIRCLE { @Override double area(double radius) { return Math.PI * radius * radius; } }, SQUARE { @...
### Java面向对象面试题知识点详解 #### 一、Java概述 - **发展历程**:Java语言始于1991年Sun公司的James Gosling等人所开发的Oak语言,原计划用于控制嵌入式设备如电视遥控器等。随着互联网的发展,Oak在1994年...
1. **Java简介**:Java是一种跨平台、面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。它的“一次编写,到处运行”特性使得Java在软件开发领域广泛应用。 2. **环境搭建**:首先,书中会...