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

相关文章

来自专栏云霄雨霁

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

18840
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

  字符串应该是所有编程语言中使用最频繁的一种基础数据类型。如果使用不慎,我们就会为一次字符串的操作所带来的额外性能开销而付出代价。本条建议将从两个方面来探讨如...

11440
来自专栏Hongten

Python中的Class

尽管Python在Function Programming中有着其他语言难以企及的的优势,但是我们也不要忘了Python也是一门OO语言哦。因此我们关注Pyth...

13120
来自专栏向治洪

JAVA中重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时...

26560
来自专栏我是攻城师

关于Java里面的嵌套类,你了解多少?

最近在看《Core Java for the Impatient》这本书,当然为了方便我看的是英文电子版的PDF格式(有需要的朋友,可以后台留言给我),期间又重...

21140
来自专栏Micro_awake web

JavaScript OOP(一)之构造函数与new命令

 面向对象编程:Object Oriented Programming,简称OOP。 典型的oop语言,如hava、c++,存在着类的概念,类就是对象的模板 (...

21070
来自专栏xingoo, 一个梦想做发明家的程序员

直接插入排序

时间复杂度: 如果排序的数组是正序的,那么时间复杂度相当于O(n), 而如果排序是随机的,时间复杂度相当于O(n^2/4). 倒置的时间复杂度是最高的,O(n^...

19390
来自专栏Linyb极客之路

Java中<? extends T>和<? super T>的理解

比如,我们现在定义:List<? extends T>首先你很容易误解它为继承于T的所有类的集合,你可能认为,你定义的这个List可以用来put任何T的子类,那...

24510
来自专栏软件开发

JavaSE学习总结(六)——接口与抽象类

一、不需要实例化的原因 看一个示例: package com.zhangguo.chapter5.s1; /**动物园*/ public class Zoo ...

23870
来自专栏编程心路

Java基础-Object类中的方法

下面这些是 Java 中的 Object 类中方法,共 11 个,9 种方法,wait() 方法被重载了。

14830

扫码关注云+社区

领取腾讯云代金券