linkin大话面向对象--枚举
- 枚举类(enum)
其实我们使用到枚举的地方还是很多的,其实我们可以完全人工的来实现枚举的功能。比如说我现在手里的项目我就是自己实现的枚举,说白了,枚举就是一个类的多例模式。
1,使用enum声明,默认直接继承了java.lang.Enum类,而不是Object类;
2,枚举类的对象是固定的,实例个数有限,枚举对象后可以跟();跟着()的意思就是在调用相关的构造器,要是不写的话就是在调用默认的构造器。
3,枚举元素必须位于枚举类体中的最开始部分,枚举元素后要有分号与其他成员分隔;
4,枚举类的构造方法的权限修饰符默认是private;自己在定义枚举类的时候也要限定修饰符为private的。
5,一旦枚举对象后面加上{},那么该对象实际是枚举匿名内部类对象;一般在传入这个匿名内部类的时候都要实现里面的抽象方法。
6,下面这2个ipa比较重要:所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;
所有枚举类都提供一个静态的valueOf(String name)方法, 返回枚举类中对象名等于 name的对象。
/**
*
* @version 1L
* @author LinkinPark
* @since 2014-11-2
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^使用enum定义,非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
*/
public enum SeasonEnum { //在这里要列出4个枚举实例
//注意了:枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举永远不能产生实例
SPRING,SUMMER,FALL,WINTER;//默认添加 public static final //枚举类的构造器还能使用private访问控制符,默认也是使用private修饰的构造器
private SeasonEnum(){ } public static void test(SeasonEnum s){
switch(s){
case SPRING:
System.out.println("春天。。。");
break;
case SUMMER:
System.out.println("夏天。。。");
break;
case FALL:
System.out.println("秋天。。。");
break;
case WINTER:
System.out.println("冬天。。。");
break;
}
} public static void main(String[] args) {
for(SeasonEnum s:SeasonEnum.values()){
System.out.println(s);
} SeasonEnum.test(SeasonEnum.SPRING);
} }
- Java5开始出现枚举:
<1>.私有的构造方法
<2>.每个元素分别用一个公有的静态成员变量表示,枚举类的对象是固定的,实例个数有限。
<3>.枚举的直接父类java.lang.Enum;
<4>.枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
<5>.枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。
<6>.把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
<7>.枚举只有一个成员时,就可以作为一种单例的实现方式。
<8>.枚举元素有大括号对时,此时属性是枚举类的匿名内部类对象。(查看编译后的class文件)
<9>.所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;
<10>.Enum常见方法:
String name();// 返回枚举实例名称;
int ordinal();// 返回枚举实例在枚举类中的索引,从0开始;
String toString();// 返回枚举对象的"自我描述";(看源代码)
<11>.在switch语句中使用枚举对象;
<12>.枚举类的构造方法;
<13>.枚举类覆写接口抽象方法的两种方式:
a.在枚举类中实现接口抽象方法;
b.在枚举匿名内部类对象中实现接口抽象方法;
public enum Gender {
MALE("男","这里是男的"),FEMALE("女","这里是女的");
//其实也可以不用枚举的 ,定义一个抽象类继承Enum,之后再继承这个抽象类,定义2个方法分别来获得下面的2个属性
//public static final Gender MALE = new Gender("男","这里是男的");
private final String name;
private final String lable;
private Gender(String name,String lable){
this.name = name;
this.lable = lable;
}
public String getName(){
return this.name;
}
public String getLable(){
return this.lable;
}
//可以到的上面构造器中传入的2个字符串的
public static void main(String[] args) {
System.out.println(Gender.MALE.getName());
System.out.println(Gender.MALE.getLable());
}
}
- 枚举类实现接口
枚举类覆写接口抽象方法的两种方式:
1,在枚举类中实现接口的抽象方法;
2,在枚举匿名内部类中实现接口的抽象方法;
//实现接口的枚举
public enum Linkin implements GenderDesc{ MALE("男"),FEMALE("女");
private String name; @Override
public void show() {
System.out.println("这里是一个用于定义性别属性的方法。。。");
} private Linkin(String name){
this.name = name;
} public String getName(){
return this.name;
} } interface GenderDesc{
void show();
}
<pre name="code" class="java">//实现接口的枚举
//让每个枚举类在调用方法时呈现出不同的行为方式
public enum Linkin implements GenderDesc{ //MALE FEMALE 实际上是Linkin匿名子类的实例 MALE("男"){
public void show() {
System.out.println("这里创建的是男的实例。。。");
}
},FEMALE("女"){
public void show() {
System.out.println("这里创建的是女的实例。。。");
}
};
private String name; private Linkin(String name){
this.name = name;
} public String getName(){
return this.name;
} } interface GenderDesc{
void show();
}
- 包含抽象方法的枚举类
public enum Linkin{
PLUS{
public double eval(double x,double y){
return x+y;
}
},
MINUS{
public double eval(double x,double y){
return x-y;
}
},
TIMES{
public double eval(double x,double y){
return x*y;
}
},
DIVIDE{
public double eval(double x,double y){
return x/y;
}
};
abstract public double eval(double x,double y);
public static void main(String[] args) {
System.out.println(Linkin.PLUS.eval(1, 1));
System.out.println(Linkin.MINUS.eval(1, 1));
System.out.println(Linkin.TIMES.eval(1, 1));
System.out.println(Linkin.DIVIDE.eval(1, 1));
}
}
- 枚举类的单例模式
使用枚举类来实现单例模式的好处是这样非常简洁,并且无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。
——来自《Effective Java》(作者:Josh Bloch)
enum Singleton {
INSTANCE;//唯一实例
public void print(){
System.out.println("使用enum实现单例模式");
}
public static Singleton getInstance(){
return INSTANCE;
}
}
linkin大话面向对象--枚举的更多相关文章
- linkin大话面向对象--类和对象
我们每天在撸码,那么我们在敲什么东西呢?明显的我们在写类,写一个类,写一个接口,写某个接口里面写一些属性,在某个类里面写一个方法,然后以一个对象调用方法,对于j2ee来讲的话,可能还会写一些jsp,静 ...
- linkin大话面向对象--闭包和回调
先来理解2个概念:闭包和回调 什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...
- linkin大话面向对象--多态
java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...
- linkin大话面向对象--GC和jar包
GC java的垃圾回机制是java语言的重要机制之一.当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中.当这块内存不再被任何变量引用时,这块内存就 ...
- linkin大话面向对象--内部类
内部类说白了就是类中有类 内部类:嵌套类 外部类:宿主类 内部类主要有以下作用:记住了3个字:多继承... 1,内部类提供了更好的封装,可以把内部类隐藏在外部类中,不允许同一个包中的其他类访问该类. ...
- linkin大话面向对象--接口
接口(interface)的概念,掌握接口很重要,以后所有的编程都要面向接口编程.其实接口的内涵就7个字:规范和实现分离. 抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特 ...
- linkin大话面向对象--包装类
Java提倡的万物皆对象,但是数据类型的划分出现了基本数据类型和引用数据类型,那么我们怎么能把基本数据类型称为对象呢? 基本数据类型 包装类 byte Byte short Short int Int ...
- linkin大话面向对象--java关键字
java中的关键字有以下几个,他们不能作任何其它的用途. 发现没,java中的关键字全是小写,java是严格区分大小写的. abstract default null synchronized ...
- linkin大话面向对象--初始化块
java使用构造器来对单个对象进行初始化操作,使用构造器先完成整个java对象的状态初始化,然后将java对象返回给程序,从而让整个java对象的信息更加完整.与构造器作用非常类似的是初始化块,它也可 ...
随机推荐
- 关于ORM的浴室思考
这是一个由EF群引发的随笔 平时在一个EF群摸鱼,日常问题可以归纳为以下几种: 这条sql用linq怎么写? EF可以调用我写的存储过程么? EF好慢啊一些复杂查询写起来好麻烦-- 为什么会有这些问题 ...
- 转载自 BotVS 「 珍藏版 」如何搭建一个完整的交易框架
[img]http://dn-filebox.qbox.me/8c218c119046b2a25df2d9c7b00c1e0fa6899bdd.png[/img]NO:01 交易策略 ≠ 交易系统. ...
- SAP成都研究院35岁以上的开发人员都去哪儿了?
2006年成立的SAP成都研究院,位于天府软件园B区.如今,因为研究院发展的不断壮大, 已经搬迁到天府软件园E区了,因此,发生在图片building各种充满悲欢离合的故事,已经成为一部分小伙伴脑海中难 ...
- 七牛php-sdk使用-文档处理
所用到的七牛文档转换服务,主要是:ppt文件转为pdf文件,pdf文件转图片(png). 描述一下需求:上传PPT或者PDF文件到七牛,最终转换为图片.文件上传部分的功能已经讲过了,这里说一下转换处理 ...
- iOS学习——Xcode9上传项目到GitHub
最近通过视频在学习一个完整项目的开发流程和思路,为了更真实地模拟在实际开发中的流程,我们需要将项目的代码以及一些资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理. ...
- JAVA基础-File类
一.File类概述 File类是文件和目录路径名的抽象表示形式.File类可以理解为一个文件路径或者文件夹路径的JAVA表现形式,而路径又可以分为绝对路径(是一个固定路径,从盘符开始),相对路径(相对 ...
- BC#64 4.Tree
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5589 对于u,v的xor和就是u到根的xor和 xor上 v到根的xor和.看到n<=5w,考虑莫队 ...
- ZOJ 1002 DFS
Fire Net Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose that we have a square city with s ...
- hdu_4869(费马小定理+快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4869 Turn the pokers Time Limit: 2000/1000 MS (Java/O ...
- [国嵌笔记][017][Makefile工程管理]
Makefile的用途 1.make能够使整个程序的编译.链接只需一个命令就可以完成 2.make的工作主要依赖于Makefile的文件.Makefile文件描述了整个程序的编译.链接等规则,使之自动 ...