java多态,如何理解父类引用指向子类对象

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

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过   Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解。

但当我这样定义时:   Animal a = new Cat(); 这代表什么意思呢?

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

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

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

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

看下面这段程序:

class Father { 
    public void func1() { 
        func2(); 
    }

// 这是父类中的func2()方法,因为下面的子类中重写了该方法

//所以在父类类型的引用中调用时,这个方法将不再有效,取而代之的是将调用子类中重写的func2()方法 
    public void func2() { 
        System.out.println("AAA"); 
    } 

class Child extends Father {

// func1(int i)是对func1()方法的一个重载 
   由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用 
    所以在下面的main方法中child.func1(68)是不对的 
    public void func1(int i) { 
        System.out.println("BBB"); 
    } // func2()重写了父类Father中的func2()方法   如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法 
    public void func2() { 
        System.out.println("CCC"); 
    } 

public class PolymorphismTest { 
    public static void main(String[] args) { 
        Father child = new Child(); 
        child.func1();// 打印结果将会是什么? } }

上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的 func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int  i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2() 
    } 
}

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

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

一、使用父类类型的引用指向子类的对象;

二、该引用只能调用父类中定义的方法和变量;

三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

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

多态的3个必要条件:

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

转载于:https://www.cnblogs.com/xuyuanjia/p/5411284.html

Java多态-如何理解父类引用指向子类对象相关推荐

  1. java 父类引用子类对象_java多态,如何理解父类引用指向子类对象

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

  2. 如何理解父类引用指向子类对象

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

  3. java父类引用子类_java多态,如何理解父类引用指向子类对象

    要理解多态性,首先要知道什么是"向上转型". 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求 ...

  4. 从JVM理解父类引用指向子类对象

    关键字:多态.动态链接和向上转型 方法的重写.重载与动态链接构成多态性. 什么是动态链接?当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用:对于父类中定义的方法 ...

  5. java -----多态:父类引用指向子类对象

    生活中的人物视角 程序中的多态 概念:父类引用指向子类对象,从而产生多种形态 一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定 比 ...

  6. Java 理解点整理:父类引用指向子类对象(多态)

    前言 本章主要对"Java的多态"做一个简单的说明. 1.父类引用指向子类对象代码演示 1. 代码:父类Animal,子类Dog,子类Cat//父类:动物 public class ...

  7. Java多态 父类引用指向子类对象

    原文地址http://www.cnblogs.com/111testing/p/6880831.html Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 ...

  8. 多态的理解(父类引用指向子类对象)

    多态: 要有继承,方法的重写,父类引用指向子类对象           ?疑问:Animal cat = new Cat(); //向上转型.        父类引用指向子类对象,该引用不能再访问子类 ...

  9. java子类引用指向父类对象_Java多态 父类引用指向子类对象

    Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 输出结果为: 给出结论:Father  c  =  new  Child()    在c的 ...

最新文章

  1. php修改时区MST,4、修改Cacti绘图的时间精度
  2. 基于PHP的图片共享网站设计,基于php实现的web图片共享系统(论文+程序)
  3. 第二阶段冲刺第四天(6月3号)
  4. javaSE各阶段练习题--面向对象-static-String-StringBuilder
  5. Vue Webpack常见问题(持续更新)
  6. 選大學了﹖請看“上大學”網
  7. SQL2000和SQL2005同时安装问题(转载)
  8. WINDOWS 下将 FAT OR FAT32 转换成 NTFS 格式
  9. Iperf官方andriod版iperf3
  10. 计算机网络原理视频学习教程
  11. 字节二面、三面面经及内推
  12. 【八校联考2013】百团大战
  13. 关于中国教育出来的学生
  14. 基于android的手机位置系统,基于Android和SIM900A模块的位置实时监控系统的设计与实现...
  15. 安卓APP限制截屏录屏解决方案
  16. 【恋恋不忘你xp主题】_8.4
  17. 普通一本如何才能进入腾讯、阿里等一流互联网大厂?
  18. 7-9 小于m的最大的10个素数 (15 分)
  19. Livy REST API使用教程
  20. 5.19 c语言--循环选择--找到N个数中最大的一个数

热门文章

  1. 【推荐】《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》
  2. 关于Go语言在服务端做Restful接口和socket通信
  3. 语音识别框架最新进展——深度全序列卷积神经网络登场
  4. 深度学习综述(LeCun、Bengio和Hinton)
  5. ruby 反射机制常用方法
  6. 2014百度研发真题及其解析-求比指定数大且最小的“不重复数”
  7. UVA 253 Cube painting
  8. Python3学习笔记:使用代理访问url地址
  9. 读文件夹下所有文件,并提取中文字符
  10. Ruby on rails环境和开发工具准备...