文档章节

java基础-多态是什么?

KongFanhao
 KongFanhao
发布于 2016/09/18 15:26
字数 967
阅读 47
收藏 1

1.1 什么是多态?

多态是继数据抽象和继承之后的第三种基本特征。

定义:多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

面向对象特性:“封装”通过合并特征和行为来创建新的数据类型。而“多态”的作用则是消除类型之间的耦合关系。

“继承”允许将对象视为它自己本身的类型或其基本类型来加以处理,它允许将多种类型(从同一基类导出 )视为同一类型来处理。

而“多态”方法调用允许一种类型表现出与其他相似类型之间的区别,只要他们都是从同一类型导出的。

 

△△△ 我现在这么认为,多态和继承说的是一个事情,都是说的是类与类之间的关系。

我的理解是 继承表现的是具有相同成员的基类和导出类的关系。

而多态表示的是在调用相同类型的时候,表现出来的调用哪个方法的问题。

1.2  多态是如何实现的呢?

答:通过动态绑定。

什么是绑定? 抽象来讲,将一个方法调用同一个方法主体关联起来被称作绑定。

若在程序执行前进行绑定,则称为前期绑定。

而当我们的方法需要一个基类类型的时候,却传入了一个子类对象,而编译器能在运行时

动态的判断出子类的类型,这种机制就是动态绑定,也叫运行时绑定或者后期绑定。

想一下就能知道,这是通过在对象中加入了“类型信息”实现的。

△△△ 注意:java中除了static 和 final方法之外,其他的方法都是动态绑定的。

当我们为一个方法定义为final的时候,除了可以防止其他人覆盖该方法,还有就是告诉编译器,这个方法不需要动态绑定,编译器就可以为final方法的调用生成更为有效的方法。

我们知道了所有方法都是通过动态绑定来实现多态这个事实之后,我们就可以大胆编写只和基类打交道的程序代码了。

1.3  多态实现可扩展

package polymorphism.music;

public class Music {
	public static void tune(Instrument i) {
		// ...
		i.play(Note.MIDDLE_C);
	}

	public static void main(String[] args) {
		Wind flute = new Wind();
		tune(flute); // Upcasting
	}
}

 

比如在这个类当中,我们的方法tune()只和基类Instrument打交道,当我们需要新的乐器的时候,不需要改变原来的tune()。只需要创建新乐器类型就好了。在一个设计良好的OOP程序中,大多数或者所有的方法都会遵循tune()模型,而且只与基类接口通信,这就实现了可扩展性。

 

也就是说,我们所修改的代码,不会对程序中其他不应收到影响的部分产生破坏。

换句话说,多态是让程序员”将改变的事物与未改变的事物分离“的重要技术。

 

 

著作权归@kfh所有转载请注明出处

 

© 著作权归作者所有

KongFanhao
粉丝 5
博文 76
码字总数 42265
作品 0
海淀
程序员
私信 提问
Java面试题:面向对象,类加载器,JDBC, Spring 基础概念

为什么说Java是一门平台无关语言? 平台无关实际的含义是“一次编写到处运行”。Java 能够做到是因为它的字节码(byte code)可以运行在任何操作系统上,与底层系统无关。 2. 为什么 Java 不...

Java干货分享
2018/12/17
77
0
每周10道Java面试题:面向对象, 类加载器, JDBC, Spring 基础概念

本文作者:ImportNew -唐尤华 未经许可,禁止转载! 每周10道 Java 面试题由 ImportNew 整理编译自网络,欢迎投稿您面试中遇到过的疑难问题。 1. 为什么说Java是一门平台无关语言? 平台无关...

ImportNew
2018/12/13
0
0
java新手学习,学到迷茫了……

我刚刚学了C++的基本语法,学到了继承派生、多态性虚函数那里,然后要是继续学的话,该学什么内容啊???到这里开始迷茫了。 因为觉得java和C++蛮像的,也比较实用,所以想同时对比着学习j...

螭离得心.
2012/08/30
1K
12
小谈Java Enum的多态性

Enum+多态,我没说错,不过Enum是不可以被继承的,也不可以继承自别人,只是能实现接口而已,何谈多态? 不过还是先看看“现象”吧: Java代码 public enum Fruit { APPLE, PEAR, PEACH, OR...

关西大汉弹琵琶
2015/05/30
229
0
编程思想 Java中对象的本质

Bruce Eckel 前辈写的《Java编程思想》把问题探讨得非常深入,非常建议同行都学习一下。学习 Java 语言时,老师告诉你 What,自己练习知道 How ,Bruce Eckel 告诉你Why 。 之前已经把后面的...

木云凌
2016/02/23
123
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Optional:优雅地避免 NPE

本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的。 空指针异常(NullPointException,简称...

武培轩
13分钟前
0
0
CountDownLatch实现的并发框架

目录结构 package com.**.**.base.support.executor;import lombok.NoArgsConstructor;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;imp......

MR_TE
14分钟前
2
0
学习记录(day06-事件、按键修饰符、计算属性)

[TOC] 1.1 事件修饰符/按键修饰符 vue 通过事件修饰符对dom事件细节进行控制 <标签 @事件.修饰符="函数"></标签>.prevent ---阻止浏览器默认行为.stop ---阻止浏览器事件冒泡.e...

庭前云落
34分钟前
0
0
006-Sigle-基于blockstack去中心化博客

本篇文章主要讲解有关基于Blockstack的Sigle是一个去中心化的博客项目; 官网地址:https://www.sigle.io/ Github地址:https://github.com/pradel/sigle 页面展示: 介绍: A beautiful de...

Riverzhou
41分钟前
15
0
驰骋工作流引擎开发平台属性功能的隐藏显示介绍

关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明 工作流设计 工作流快速开发平台 业务流程管理 bpm工作流系统 java工作流主流框架 自定义...

孟娟
43分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部