- 浏览: 194445 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
find13:
学习
iReport中文教程 -
coderfly:
thanks !
iReport中文教程 -
月亮不懂夜的黑:
下载 学习。thanks!
iReport中文教程 -
yanqingluo:
谢谢,先转走.再验证.
eclipse maven debug -
周佳1986:
谢谢,分享。
iReport中文教程
Enum 多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态?
不过还是先看看“现象”吧:
Java代码
public enum Fruit { APPLE, PEAR, PEACH, ORANGE; }
以上是一个简单的enum,关于它,我要补充一点:
Fruit是java.lang.Enum的子类,准确地说,是Enum<Fruit>的子类,这里出现了一个继承关系,不过这个继承是编译器帮我们做的,我们不能显式地去做。不信的话我们可以试着用一个Enum<Fruit>的引用去指向一个APPLE,肯定是没问题的,我就不再试了。
为了更直观地说明这一点,我们来看看Fruit的反编译结果吧:
package test; public final class Fruit extends Enum { private Fruit(String s, int i) { super(s, i); } public static Fruit[] values() { Fruit afruit[]; int i; Fruit afruit1[]; System.arraycopy(afruit = ENUM$VALUES, 0, afruit1 = new Fruit[i = afruit.length], 0, i); return afruit1; } public static Fruit valueOf(String s) { return (Fruit) Enum.valueOf(test / Fruit, s); } public static final Fruit APPLE; public static final Fruit PEAR; public static final Fruit PEACH; public static final Fruit ORANGE; private static final Fruit ENUM$VALUES[]; static { APPLE = new Fruit("APPLE", 0); PEAR = new Fruit("PEAR", 1); PEACH = new Fruit("PEACH", 2); ORANGE = new Fruit("ORANGE", 3); ENUM$VALUES = (new Fruit[] { APPLE, PEAR, PEACH, ORANGE }); } }
注意这几行:
public static final Fruit APPLE; public static final Fruit PEAR; public static final Fruit PEACH; public static final Fruit ORANGE;
看来JDK
Enum的实现也不过就是沿袭了Effective Java中提出的TypeSafeEnum模式,只不过是在编译器和JVM等更底层的级别上提供了支持。
至此,至少说明了Fruit和Enum的继承关系,但问题是:现在不能继续再从Fruit派生子类,那么哪来的多态呢?
还是再多写点代码吧:
public enum Fruit { APPLE { public void test() { System.out.println("I am an apple."); } }, PEAR { public void test() { System.out.println("I am a pear."); } }, PEACH { public void test() { System.out.println("I am a peach."); } }, ORANGE; public void test() { System.out.println("I am a fruit."); } } public enum Fruit { APPLE { public void test() { System.out.println("I am an apple."); } }, PEAR { public void test() { System.out.println("I am a pear."); } }, PEACH { public void test() { System.out.println("I am a peach."); } }, ORANGE; public void test() { System.out.println("I am a fruit."); } }
其中,只有Orange没有Overide
test()方法;
我们在主函数中调用它们:
public static void main(String[] args) { Fruit.APPLE.test(); Fruit.PEAR.test(); Fruit.PEACH.test(); Fruit.ORANGE.test(); } public static void main(String[] args) { Fruit.APPLE.test(); Fruit.PEAR.test(); Fruit.PEACH.test(); Fruit.ORANGE.test(); }
输出结果:
引用
I am an apple.
I am a pear.
I am a peach.
I am a fruit.
可以看到,重新定义了test方法的APPLE,PEAR,PEACH覆盖了从父类继承过来的默认行为,而未从新定义test方法的ORANGE却沿袭了父类的行为,多态性在这里展现出来了。
那么我们刚才明明看见过Fruit的反编译结果,没有任何新类继承自Fruit,那么这些多态行为是哪里冒出来的呢?说它是“多态”是否准确呢?
其实,Fruit类在这个时候已经发生了微妙的变化,一切都与JDK的Enum的实现有关,我们现在可以到编译结果目录下面看看:
怎么除了Fruit.class之外,还多了几个貌似是内部类的class文件??也许看到这里我们能有点线索了,不过还是在这个时候在看看反编译结果吧,看看它到底在搞什么鬼:
发表评论
-
spring事务管理的几种方式
2014-06-19 20:38 6686原文:http://sishuok.com/forum/bl ... -
【转】<maven权威指南>学习笔记
2013-06-06 12:32 1143一些常用的命令 mvn help:effective-pom ... -
ubuntu 下安装oracle客户端oracle-xe-client
2012-12-13 16:19 1686本文转自 http://os.chinaunix.net/a2 ... -
JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat
2012-12-11 23:46 5706本文转自:http://blog.csdn.net/ke ... -
iReport中文教程
2012-11-22 19:11 1909iReport中文教程 -
svn cat 查看历史版本信息
2012-11-13 12:01 9096转自:http://lee2013.iteye.com/ ... -
【转】自动ssh登录的几种方法
2012-11-01 19:50 1089本文转自 http://blueicer.blog.51cto ... -
【转】ubuntu自动登录ssh
2012-11-01 19:47 1092本文转自 http://huqilong.b ... -
Oracle Instant Client
2012-10-30 15:38 1245转自:https://help.ubuntu.com/comm ... -
ORACLE 时间函数(SYSDATE)
2012-10-22 20:40 1857本文转自:http://www.cnblogs.com/jin ... -
Linux下如何保持gnome-terminal窗口执行命令后停留而不立刻关闭(gnome-terminal -x)
2012-10-17 11:46 12059Linux下如何保持gnome-terminal窗口执行命令 ... -
常见Oracle HINT的用法
2012-10-10 17:17 924常见Oracle HINT的用法 1. /*+ALL ... -
快速理解VirtualBox的四种网络连接方式
2012-10-06 11:54 984本文转自:http://www.cnblogs. ... -
HTML页面跳转的5种方法【转】
2012-07-02 14:49 1945转自:http://blog.sina.com.cn/s/bl ... -
【转】健康成长系列之宝宝不能乱吃的那些食物 大家警惕
2012-06-05 18:40 1096转自:http://www.19lou.com/foru ... -
Ajax 跨域代理
2012-05-23 14:56 1438使用了httpclient做代理请求。 import ... -
电脑保护色
2012-05-01 15:56 911色调(E):85 饱和度(S):95 亮度(L):2 ... -
【转】Ubuntu10.04下安装oracle客户端 oracle-ex-client, 使用sqlplus
2012-04-27 11:55 1442本文来源于:http://329937021.iteye.co ... -
Ubuntu apt.conf 代理
2012-04-24 16:19 1765Acquire::http::Proxy "h ... -
【转】Oracle的decode、sign、trunc函数
2012-04-20 13:46 1434本文转自 http://knowyouknowme.iteye ...
相关推荐
Java中的枚举(enum)类型是在JDK 1.5版本引入的一个强大的特性,它用于定义一组相关的常量。在C/C++等语言中,枚举通常用来表示一组具有固定值的常量集合,但在Java中,枚举不仅限于此,它提供了更多的功能和灵活性...
Java中的枚举(enum)类型是在JDK 1.5版本引入的一种强大的特性,它用于定义一组相关的常量。在C/C++等早期语言中,枚举通常是一种基本的数据类型,而在Java中,枚举是一种类,具有更多的功能和灵活性。 1. **什么...
Java枚举(Enum)是Java语言中的一个特殊类,它在`java.lang`包下,是面向对象编程中的一种常量表示方式。本章节将深入探讨Java枚举的源码和《Thinking in Java》第十九章中关于枚举的内容。 在Java中,枚举是一种...
在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比常量集合或字符串常量更安全、更方便。本教程将深入探讨Java枚举的构造函数及方法的使用,帮助开发者更好地理解和运用这一...
通过上述分析,可以看出`Enum`不仅是一种数据类型,更是一种设计模式,它集成了封装、继承和多态等面向对象编程的核心概念,为开发者提供了强大的工具箱,用以处理固定集合的常量。然而,`Enum`的使用也需要遵循一定...
Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...
- 所有枚举类型都是`java.lang.Enum`的子类。 2. **方法介绍**: - `values()`:返回包含所有枚举常量的数组。 - `valueOf(String name)`:根据名称获取对应的枚举常量。 - 示例代码: ```java for (Train t ...
5. 枚举(Enum)与多态:Java枚举可以被视为单例类的特殊形式,它们也支持多态。枚举类型的每个实例可以有自己的方法,这些方法可以被其他类的引用调用,实现多态行为。 总之,Java的面向对象多态性使得程序设计...
Java是一种广泛使用的面向对象编程语言,其核心特性包括封装、继承、多态和抽象等概念。下面是对这些关键面向对象概念的详细解释。 1. **封装**:封装是面向对象编程的基本原则之一,它指的是将数据(属性)和操作...
- 枚举(Enum):Java中的枚举类型是一种特殊的类,用于定义一组固定的值,常用于表示有限集合。 - 内部类:在Java中,类可以嵌套在另一个类内部,提供更高级别的封装。 - 接口的默认方法和静态方法:Java 8引入的新...
- 枚举(enum):Java的枚举类型用于定义一组固定值的常量集合。 - 泛型(Generics):提供类型安全的容器,减少类型转换错误。 - 异常处理(Exception Handling):通过try-catch-finally语句处理程序运行时可能...
在这个主题中,我们将深入探讨Java中的面向对象编程概念,包括类、对象、封装、继承、多态等关键知识点。 1. 类与对象 在Java中,类是对象的蓝图,它定义了对象的属性(数据成员)和行为(方法)。创建类时,我们...
9. 枚举(Enum):枚举是Java中的一种特殊类,用于表示有限集合的固定值。枚举类型可以提供比常量更强大的功能,包括方法的定义和继承。 10. 内部类(Inner Class):内部类是定义在一个类内部的类,它可以访问外部...
本文旨在详细介绍 Java 面试题集及参考答案,涵盖了 Java 面试的多个方面,包括面向对象的三个特征、多态、抽象类和接口的区别、构造器、访问修饰符、静态变量和实例变量的区别、不可变对象、创建对象的几种方式、...
在Java中,多态分为编译时多态(通过重载方法实现)和运行时多态(通过重写方法实现),它增强了代码的灵活性和扩展性。 压缩包中的"面向对象与设计_CODE"可能包含以下示例: 1. 类与对象:简单的类定义,以及如何...
在Java中,面向对象编程主要包括四大基本概念:封装、继承、多态和抽象。以下是对这些概念的详细解释: 1. 封装:封装是将数据(属性)和操作这些数据的方法(函数)绑定在一起,形成一个独立的单元,称为类。类是...
1. 面向对象:Java支持类、对象、继承、封装和多态等面向对象的特性,使得代码更易于维护和扩展。 2. 自动内存管理:通过垃圾回收机制,Java自动处理内存分配和释放,避免了常见的内存泄漏问题。 3. 异常处理:Java...
7. 枚举与注解:Java中的枚举(Enum)类型是常量的集合,提供了安全且可读性高的数据表示方式。注解(Annotation)则是一种元数据,可以用于代码的编译时和运行时处理。 8. 异常处理:Java中的异常处理机制(try-...
* Java 中的常用类库和新特性技术:Assert、Generic、Enum、Annotation、StaticImport、Autoboxing、Unboxing 等 面向对象编程 * 面向对象的分析和设计 * 类和对象、继承和多态、访问控制权限、接口和抽象类的应用...
10. **枚举(Enum)**:枚举是Java中一种特殊的类,用于表示有限的一组值。练习可能包含创建枚举类型,以及使用它们在switch语句中。 这个"Java(OOP)练习及作业"的压缩包提供了一个全面的学习平台,涵盖了Java OOP...