深入浅出学枚举
来源:互联网 发布:nagios监控mysql主从 编辑:程序博客网 时间:2024/06/07 14:55
我发现我上一篇写得有点像民间教材似口味,就是类似于以前在c语言贴吧上看到的有个哥们发帖教人学c语言用的口语,因为我不只是写给录取的老师看的,也希望路过的学java的朋友在看到我写的文章之后,会稍微有点收获,这样就够了^ ^ 只是我的都是不按学习顺序写的,有一定基础的看客可以看看,高手就忽略吧。
沿用上一篇的风格,这一篇我们讨论一下枚举类型,前几天买了本java核心技术第一卷,打算把基础再再加强,一同购买的还有java版本的数据结构,因为我发现我算法方面很烂,搞安桌的不懂算法,会死人的,时间紧啊,还有两个月就要开第四期的黑马班了,在确认被录取的之后我想把javaee的视频都过一遍,有个大概印象,到时候就可以把更多的心思摆在andriod上。
好的,开始剖析一下java里面的枚举类型吧。在1.5之后,jdk还新增加了一个枚举类型,具体使用方法和C/C++差不多。我在翻看core java 的时候,发现里面对枚举的描述很少,在看高新技术视频和javaweb开发第一天讲的内容的时候,发现里面讲的比较深。说到枚举,在1.5以前,大家往往会用一些别的方法来模仿它的实现,比如有四只动物,dog,cat,monkey,person(姑且算动物吧),要实现类似于枚举的效果,你可以这样做:
public class Animals2 { public static final Animals2 Dog = new Animals2() public static final Animals2 CAT = new Animals2() public static final Animals2 MONKEY = new Animals2() public static final Animals2 PERSON = new Animals2() private Animals2() {}
在1.5之后,更多的人会选择这样做:
public enum Animals implements behavior{ DOG, CAT, MONKEY, PERSON, Private}
似乎是方便了一点,另外枚举类的构造方法默认是私有的,就是说你无法进行new Animals()操作,枚举类型里面还可以增加方法,比如你可以增加一个这样的方法:
public void scream() { System.out.println("动物在尖叫"); }
在调用的时候你会发现每个动物都是调用动物的尖叫,而不是自己独有的,这时候就有必要重写它的方法,代码如下;
public enum Animals{ DOG() { @Override public void scream() { System.out.println("DOG is screaming"); } }, CAT() { @Override public void scream() { System.out.println("CAT is screaming"); } }, MONKEY() { @Override public void scream() { System.out.println("MONKEY is screaming"); } }, PERSON() { @Override public void scream() { System.out.println("PERSON is screaming"); } }; public void scream() { System.out.println("动物在尖叫"); }}
根据多态的原则,虚拟机在调用对象方法的时候会先去查看该对象有无此方法(实际上是查看一下该对象方法的列表),再去查看父类的方法列表,所以毫无疑问,会调用已经重写了的scream方法。这些小知识都是视频上讲解过的,我有点好奇,想这枚举类型究竟能不能继承某个类或者实现某个接口呢?答案是,不能继承,但能实现某个接口。比如我写了个behavior接口,里面有一个需要实现的方法,scream(),并让Animals实现了这个接口(先把之前写的scream方法删掉,以免混淆视听),具体代码如下:
public enum Animals implements behavior{ DOG() { @Override public void scream() { System.out.println("DOG is screaming"); } }, CAT() { @Override public void scream() { System.out.println("CAT is screaming"); } }, MONKEY() { @Override public void scream() { System.out.println("MONKEY is screaming"); } }, PERSON() { @Override public void scream() { System.out.println("PERSON is screaming"); } }; @Override public void scream() { System.out.println("动物在尖叫"); }} //接口代码如下:public interface behavior { public void scream();}
好的,你会发现其实和上一个写的差不多,在这个例子中接口的好处并没有体现出来,要是除了animals类之外,还有一个叫植物的类,一个叫外星生物的类,一个叫外星植物的类,都实现了behavor接口,然后有那么一个方法,该方法会调用传递进来的各种动,植物,外星动,植物的类的对象的scream方法,你唯一能做的就只有把参数的类型写成behavior类型,对不?
这就是接口的好处。
好了,枚举的基础剖析也差不多,再深层次一点的我还没体会出来,另外细想了一下为什么枚举类型不能继承XX类,假设:如果能继承,那么该枚举里面的所有对象都拥有父类自己的方法,这似乎可以说得过去,同时也拥有该父类的字段(field),似乎也没不妥,想不通,这就作为一个问题吧。
最后用一个普通的类实现了枚举的表面功能,代码如下:
public class Animals2 implements behavior { public static final Animals2 Dog = new Animals2(){ @Override public void scream() { System.out.println("Dog在尖叫"); } }; public static final Animals2 CAT = new Animals2(){ @Override public void scream() { System.out.println("CAT在尖叫"); } };; public static final Animals2 MONKEY = new Animals2(){ @Override public void scream() { System.out.println("MONKEY在尖叫"); } };; public static final Animals2 PERSON = new Animals2(){ @Override public void scream() { System.out.println("PERSON在尖叫"); } };; private Animals2() {} @Override public void scream() { System.out.println("动物在尖叫"); } }//在main方法中你完全可以这样调用:public static void main(String[] args) { Animals2.CAT.scream(); Animals.CAT.scream(); }
效果一样吧,枚举类型里面有一些方法是jdk提供的,想自己用普通类实现它全部功能的朋友可以试下,笔者能力有限= =就罢了。
- 深入浅出学枚举
- 枚举类 深入浅出
- 深入浅出学Hibernate4
- 深入浅出学Hive
- 【枚举】Fish学数学
- 简简单单学枚举
- 《深入浅出学Java中级教程》
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- 深入浅出学Spring Data JPA
- strust2.xml详解
- Android Notification 基础
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- android按键映射
- linux 查看文件内容的命令
- 深入浅出学枚举
- Android Binder机制の代码角度分析
- HashSet和HashCode的关系
- 查看服务器硬盘信息
- Android的UI构造试图工具hierarchyviewer
- printf
- pugixml 一个xml解析库 简单快速, 支持XPath表达式, 感谢作者
- Linux/Unix下Shell快捷键操作大集合及部分Bash使用技巧-另附Ubuntu常用快捷键
- cache笔记一 相关配置以及变量