多态

多态

[TOC]

什么是多态

多态就是同类型的对象,表现出不同的形态

多态的表现形式

父类类型 对象名称 = 子类对象;

多态的前提

  • 有继承关系
  • 有父类引用指向子类对象 Fu f = new Zi()
  • 需要有方法的重写

多态好处

使用父类类型作为参数,可以接受所有子类对象。

多态调用成员特点

  • 变量调用:编译看左边,运行也看左边
    • 编译看左边:javac编译代码的时候,会看左边父类中有没有这个变量,如果有,编译成功,如果没有编译失败
    • 运行也看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
  • 方法调用:编译看左边,运行看右边
    • 编译看左边:javac编译代码的时候,会看左边的父类有没有这个方法,如果有,编译成功,否则编译失败
    • 运行看右边:java运行代码的时候,实际上运行的是子类中的方法

造成这样结果的原因是:

  • 成员变量:在子类对象中,会把父类的成员变量也继承下来。父:name –> 子:name
  • 成员方法:如果子类对方法进行了重写,那么在虚方法表中就会把父类的方法进行覆盖。

多态的优势以及弊端

优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
  • 定义方法的时候,使用父类型作为参数,可以接受所有子类对象,体现多态的扩展与便利

弊端

  • 在多态模式下,不能调用子类特有的功能
    • 这是因为在编译的时候,会先去看父类有没有这个方法,如果没有直接报错。

    • 解决方案:变回子类类型就可以了

      就比如:Dog d = (Dog) a;