`

Java学习系列(二十二)Java面向对象之枚举详解

 
阅读更多

 

 

转载请注明出处: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
 

(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开发详解.zip

    000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 ...

    Java程序设计PPT详解

    本书讲解Java程序设计知识及其编程方法,包括Java语言的基础语法、结构化程序设计、面向对象程序设计、数组、字符串、向量、哈希表、泛型、枚举、异常处理、文件和数据流、图形用户界面设计、小应用程序、线程、编程...

    Java基础知识点总结.docx

    五、 封装(面向对象特征之一)★★★★ 23 六、 继承(面向对象特征之一)★★★★ 25 七、 接口(面向对象特征之一)★★★★ 28 八、 多态(面向对象特征之一)★★★★ 30 九、 java.lang.Object 31 十、 异常★...

    Java工程师面试复习指南

    面向对象基础 Java基本数据类型 字符串和包装类 关键字最终特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举...

    Java 基础核心总结 +经典算法大全.rar

    continue 语句面向对象 类也是-种对象对象的创建 属性和方法 构造方法 方法重载 方法的重写 初始化 类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限...

    【05-面向对象(下)】

    •在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用static修饰的类成员属 于类成员,类Field既可通过类来访问,也可以通过类的对象来访问。当通过对象来访问类属性时,系统会在底...

    疯狂JAVA讲义

    2.3 Java的面向对象特征 36 2.3.1 一切都是对象 37 2.3.2 类和对象 37 2.4 本章小结 37 第3章 数据类型和运算符 38 3.1 注释 39 3.1.1 单行注释和多行注释 39 3.1.2 文档注释 40 学生提问:API文档是什么? ...

    Java基础最全笔记文档

    7. 面向对象基础 8. 常用API 9. 综合项目实战 Java加强篇包括: 1. static、单例设计、继承 2. 权限修饰符、常量、枚举、抽象类 3. 多态、内部类、常用API 4. 日期与时间、日期类、包装类、正则表达式、Arrays 类、...

    java整体知识梳理.xmind

    Javaee全部内容详解包括基础语法、面向对象特征、常用类,多线程,网络编程、枚举、反射详解、常见面试题等

    整理后java开发全套达内学习笔记(含练习)

    Object [java] 对象 ['ɒbdʒekt] Overload [java] 方法的重载(不同参数列表的同名方法) [,әuvә'lәud] Override [java] 方法的覆盖(覆盖父类的方法) [,әuvә'raid] polymiorphism[java] 多态 (polymorphism ...

    Java开发技术大全 电子版

    第2篇Java面向对象编程 第3章对象和类98 3.1面向对象的基本概念98 3.1.1对象98 3.1.2类99 3.1.3消息101 3.1.4面向对象的4个基本特征101 3.2类与对象104 3.2.1类的基本结构104 3.2.2类的声明104 3.2.3创建...

    Hibernate实战(第2版 中文高清版)

     1.1.4 面向对象应用程序中的持久化   1.2 范式不匹配   1.2.1 粒度问题   1.2.2 子类型问题   1.2.3 同一性问题   1.2.4 与关联相关的问题   1.2.5 数据导航的问题   1.2.6 不匹配的代价   1.3 ...

    asp.net知识库

    ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 NET2.0系列介绍(一).NET 2.0 中Web 应用程序主题的切换 ASP.NET 2.0 中Web 应用程序主题的切换 2.0正式版中...

    Scala程序设计(第2版)

    第1章 零到六十:Scala简介 1 1.1 为什么选择Scala 1 1.1.1 富有魅力的Scala 2 1.1.2 关于Java 8 3 1.2 安装Scala 3 1.2.1 使用SBT 5 1.2.2 执行Scala命令行工具 6 1.2.3 在IDE中运行Scala ...

Global site tag (gtag.js) - Google Analytics