Java 101: Java多态及其类型

本文翻译自javaworld,原文链接https://www.javaworld.com/article/3033445/java-101-polymorphism-in-java.html

多态性是指某些实体以不同的形式出现的能力。它通常可以通过蝴蝶来说明,从幼虫到蛹再到成虫。多态也出现在编程语言中,作为一种建模技术,允许你为各种操作数、参数和对象创建单个接口。Java多态让代码更加的简洁,并且更容易维护。

虽然本教程侧重与多态性的子类型,但是多态的几种类型你也应该知道。首先我们将概述多态的四种类型。

Java中的多态类型

在Java中有四种多态类型。

强制类型转换操作支持多个类型隐式的转换。比如,你用一个整数乘另一个整数,或者一个浮点数乘另一个浮点数。如果一个操作数是整数但是另一个操作数是浮点数,编译器为了防止类型错误就会将整数隐式的转换成浮点数(没有乘法操作支持一个整数和浮点数相乘)。另一个例子是将一个方法中的父类参数指向一个子类的引用。编译器会强制将子类型转换成父类型。

重载是指在不同的上下文中使用相同的操作符或者方法名。例如,你可以使用 + 去执行整数加法,浮点数加法,或者字符串连接,这依赖于操作数的类型。同样,一个类中可以出现多个具有相同名字的方法(通过声明或者继承)。

参数多态性规定在类的生命中,一个字段名可以关联不同的类型,一个方法名可以关联不同的参数和返回值类型。这个字段和方法之后可以接受一个类实例(对象)的不同类型。例如,在一个对象中一个字段可能是Double类型(Java标准类库的成员,double的包装类型)同时一个方法也可能返回一个Double类型,同时一个相同的字段可能是String类型、相同的方法可能返回一个String类型在另一个对象中。Java通过泛型来支持参数的多态性,我们在之后的文章中会讨论到这些。

子类型是指该类型可以作为一个类型的子类型。当一个子类型实例出现在父类型的的上下文中时,在实例上执行一个父类型的操作最终执行的会是子类型的版本。比如,考虑一段可以绘制任意类型的图形的代码。你可以通过一个图形类和一个draw方法更清楚的表达这段代码;通过圆形、长方形或者其他的子类来重写draw方法。通过一个元素指向图形子类实例的图形类型数组;然后让每个实例调用图形类的draw方法。当你调用draw方法,然后将会是圆形的,长方形的或者其他图形实例的draw方法将会被调用。我们说这就是图形draw方法的多种形式。

这里重点介绍了子类型多态性。你将学习到向上转型和延迟绑定,抽象类(无法实例化),抽象方法(无法被调用)。你还将学习到向下转型和运行时类型确定,并且你将第一次看到可变返回类型。我将在后面的文章中重点介绍参数的多态性。

特定和通用多态性
像许多开发者一样,我将强制类型转换和重载作为特定多态性,将参数和子类型作为通用多态性。作为有价值的技术,我不认为强制类型转换和重载是真的多态;他们更像是类型转换和语法糖。

 

Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以直接在你的网页里面显示搜查的结果。 github-java-api github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时,支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. 支持混合使用redis缓存和memcached缓存。可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是一个用来操作Windows注册表的 Java 类库,你可以用来对注册表信息进行读写。 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像。使用简便和直截了当,用户只需要加载的图片和调整帧您想要的,如位置,时间显示和处理方法前帧。 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还能够与JSTL相结合生成数据库驱动的动态Maps。 OAuth 实现框架 Agorava Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮以及一些通用的面向对象方法。 Java数据库连接池 BoneCP BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值