要理解多态性,首先要知道什么是“向上转型”。

转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。

向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口。

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过

Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解。

但当我这样定义时: Animal a = new Cat();

表示定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。

那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的; 同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用; 对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。也可以叫做动态绑定。

动态绑定是指”在执行期间(而非编译期间)“判断所引用对象的实际类型,根据实际的类型调用其相应的方法。看如下代码:

那么该程序将会打印出什么样的结果呢? 很显然,应该是“CCC”。

在向下转型过程中,分为两种情况:

情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。

情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。实例如下:

对于多态,可以总结它为:

1、父类引用可以指向子类对象,子类引用不能指向父类对象。

2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。

如Father father = new Son();

3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。

如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;

其中father前面的(Son)必须添加,进行强制转换。

4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效

5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。

6、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

多态的3个必要条件:

1.继承 2.重写 3.父类引用指向子类对象。

java父类引用子类_java多态,如何理解父类引用指向子类对象相关推荐

  1. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

  2. java 父类转子类_Java多态,对象转型,和简单工厂模式。希望对您有帮助!

    各位读者老爷们大家好鸭~图图又来了,今天我们要说一下"多态". 怎么理解这两个字呢?可以理解为同一个引用对象的不同表现形态,即将父类的引用指向子类的对象.这是比较官方的书面解释,大 ...

  3. JAVA子类作为实参父类作为形参_java 多态 实参形参

    多态: 概述: 多态是继 封装性,继承性,面向对象的第三大特性 定义: 多态:是指同一行为具有多个不同的表现形式. 生活中:比如跑的动作:猫,狗,大象,跑起来的动作都是不一样的 飞的动作:昆虫,鸟类, ...

  4. java多态知乎_Java多态的理解

    作者:程序狗 链接:https://www.zhihu.com/questio... 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 不请自来,C++的多态不太清楚. ...

  5. java多态的理解(运行时多态)_Java多态的理解

    什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...

  6. java 判断object类型_Java多态的6大特性|乐字节

    大家好,我是乐字节的小乐,前几天讲完了Java继承,接下来我们会讲述Java多态. 以上就是本次学习的6大任务.我们依次来看. 一. Object类 Object类是所有Java类的根基类. 如果在类 ...

  7. java简单的异常_Java的简单理解(8)-异常(Exception)

    Java 异常处理 异常处理机制是Java语言中一个独特之处,它为开发稳定的软件系统提供了有力的支持.它主要使用捕获异常和声明抛弃异常两种方法来处理程序中可能出现异常的语句块,其中捕获异常的方法是一种 ...

  8. java的引用传递_Java的值传递和引用传递

    首先来看一段代码: User类: 1 public classUser {2 privateString name;3 4 publicString getName() {5 returnname;6 ...

  9. java list引用传递_java的值传递和引用传递

    昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...

最新文章

  1. redis集群扩容和缩容_Redis一站式管理平台,支持集群的创建、管理、监控和报警...
  2. 求 1000 以内的完数
  3. Java笔试题库之选题题篇【141-210题】
  4. 计算机网络学习笔记(22. Web应用概述)
  5. 为什么你的店铺不赚钱?
  6. 服务台与事件管理解决方案
  7. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月13日-8月19日)
  8. Delphi版 熊猫烧香源码
  9. 论文模型构建的步骤_论文实证经验分享|VAR模型实操步骤(下)
  10. 微信呢称含有特殊字符(emoji表情)的显示和存储到数据库的处理方法
  11. pytorch学习笔记——2.4torch.nn模块简介
  12. 树莓派Web登录校园网WIFI热点DJTU
  13. Word2Vec原理简单解析
  14. js时间戳转时间(年-月-日 时:分:秒)
  15. 快餐行业进入“黄金时代”,左手天堂右手地狱
  16. helm3 使用国内原安装Weave Scope
  17. 【MarkDown使用技巧】轻松搞定MarkDown
  18. 7-112 斐波那契数列 (10 分)
  19. 利用jieba分词分析小说一
  20. 来了!新一代 App 视觉增强辅助方案它真的来了!

热门文章

  1. 【Elasticsearch】解决Elasticsearch HTTP方式查询报SocketTimeoutException的问题 Connection reset by peer
  2. 【Java】Java Controller 每次只能一个请求 多线程 ReentrantLock
  3. 【Kafka】kafka OutOfMemoryError: Direct buffer memory Java heap space
  4. Kafka : kafka查询某时间段内的消息
  5. FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeExcepti
  6. 使用Thread类和Runnable方法来创建一个线程的区别
  7. Java创建线程的三种方式
  8. android 全局 窗口,学习笔记:WindowManager显示Android全局悬浮窗口
  9. jsp引入页面,即包含文件的两种方法介绍
  10. VisualSVN Server 的安装(windows版本)