【编程基础】如何理解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 条评论
登录 后参与评论

相关文章

来自专栏Jack-Cui

434.Number of Segments in a String(String-Easy)

Count the number of segments in a string, where a segment is defined to be a con...

1859
来自专栏编程

Kotlin学习之常用高阶函数:filter

Kotlin学习之常用高阶函数:filter Kotlin高阶函数一般是数组、集合、序列等数据结构的扩展函数,接收一个操作函数对数据进行操作,在Kotlin函数...

19710
来自专栏King_3的技术专栏

leetcode-46-全排列

vector<vector<int>> permute(vector<int>& nums) 

963
来自专栏androidBlog

java 正则表达式浅析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

501
来自专栏云霄雨霁

Java--多态性之抽象类和接口

1484
来自专栏java学习

请你对Java中树的了解有多少?

树 1200101班的学生信息表如图6.1所示,其中学生被分到了不同的学习小组,第一组组长是李华,组员有王丽、张阳、赵斌; 第二组组长是孙琪,组员有马丹; 第三...

3315
来自专栏软件开发 -- 分享 互助 成长

多维数组的理解

要清楚的理解多维数组,需要先理解指针的算术运算和数组名的含义。 1、指针的算术运算     指针的算术运算与普通的类型的算术运算是不同的,编译器会在指针的算术运...

19910
来自专栏大闲人柴毛毛

剑指 offer代码解析——面试题35第一个只出现一次的字符

本题的详细解析均在代码注释中: import java.util.LinkedHashMap; import java.util.Map; import jav...

3406
来自专栏GAN&CV

python lambda表达式的介绍和使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

601
来自专栏你不就像风一样

让你一看就懂的快速排序算法(Java)

你也许会被快速排序的文章弄得迷迷糊糊,其实大体上去看,快速排序就一步:找个数做基准数,把小于它的数移到它左边,把大于它的数移到它右边。这句话是核心。然后我们只需...

752

扫码关注云+社区