【编程基础】如何理解java中的多态

大家都知道Java面向对象有几大特征:抽象、封装、继承和多态,Java的这些特性让Java变得很强大,可以很轻松的胜任比较复杂的项目开发。今天重点给大家说说多态这个特性。

多态总结起来发生的场景就是两类:

1、对象运行时确定是子类还是父类;

2、方法运行时确定调用同名的哪个方法;

也就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

向上转型规则:

在用一个子类型复制给父类型时,指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

下面来看一个例子:

public class Animal { public void move(String string) { System.out.println(string + " is a Animal ,is moving! "); cry(); }; public void cry() { System.out.println("Animal is cry!"); } } public class Bird extends Animal { @Override public void cry() { System.out.println("Bird is crying!"); } } public class Main { public static void main(String[] args) { Animal animal = new Bird(); animal.move("animal"); } }

运行结果:

animal is a Animal ,is moving! Bird is crying!

代码分析:

Bird继承自Animal,Bird重写了父类的cry函数,move函数在父类型Animal中进行了定义。

Animal animal = new Bird();

创建一个Bird()实例,指向父类型Animal,但是它真实的类型是一个Bird类型,只是暂时隐藏了父类型中没有的方法和属性,当成一个父类型来用。

animal.move("animal");

子类中没有重写move函数,所以调用的是父类的move函数,在move函数调用了cry函数,这个函数因为在子类Bird中进行了重写,并且animal是一个Bird类型的Animal,所以会调用到子类Bird的cry函数。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小詹同学

Python 3 入门 ,看这篇就够了 。

Python 是一种高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 由 Guido van Rossum 于 1989 年底在荷兰国家数...

682
来自专栏一个会写诗的程序员的博客

第2章 Kotlin 语法基础第2章 Kotlin 语法基础

人与人之间通过语言来交流沟通,互相协作。人与计算机之间怎样“交流沟通”呢?答案是编程语言。一门语言有词、短语、句子、文章等,对应到编程语言中就是关键字、标识符、...

942
来自专栏深度学习自然语言处理

一文入门Python 3

Python 是一种高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 由 Guido van Rossum 于 1989 年底在荷兰国家数...

892
来自专栏blackheart的专栏

[C#1] 12-特性

1.特性简介 特性仅仅是为目标元素提供关联的附加信息的一种方式,编译器的工作只是将这些附加信息放到托管模块的元数据中, 大多特性对于编译器来说没有任何特殊的意义...

1848
来自专栏CodingToDie

Python学习(二):基础

第2 章 基础 Table of Contents 输入和输出 输出 输入 数据类型 整数 浮点数 字符串 布尔值 空值 变量 常量 输入和输出 输出 prin...

3805
来自专栏程序员互动联盟

【专业技术】你必须注意的11个C++要点

下面的这些要点是对所有的C++程序员都适用的。我之所以说它们是最重要的,是因为这些要点中提到的是你通常在C++书中或网站上无法找到的。如:指向成员的指针,这是许...

2625
来自专栏DOTNET

C#要点

内容摘要 1 数据类型   1.1表达范围问题   1.2 数组的长度问题   1.3 值类型与引用类型   1.4 匿名类型与隐式类型   1.5硬编码造成的...

2755
来自专栏小樱的经验随笔

Python基础学习笔记

---------2018.1.24------------ round是向上取整,引用方式为round(number[,ndigits]) 而floor是向下...

2725
来自专栏好好学java的技术栈

自己动手写一个单链表

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。

1556
来自专栏Java帮帮-微信公众号-技术文章全总结

【Java提高十五】数组

一、什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的!...

3397

扫描关注云+社区