当前位置 : 主页 > 手机开发 > 其它 >

11-多态

来源:互联网 收集:自由互联 发布时间:2021-06-19
目录 多态 概述 多态的具体情况 多态下的成员特点 成员方法 转型 向上转型 向下转型 instanceof 总结 什么时候转型 多态的好处和缺点 额外 多态 概述 例如:Student类继承了Person类,那么

目录

  • 多态
    • 概述
    • 多态的具体情况
    • 多态下的成员特点
    • 成员方法
    • 转型
      • 向上转型
      • 向下转型
      • instanceof
    • 总结
      • 什么时候转型
      • 多态的好处和缺点
      • 额外

多态

概述

例如:Student类继承了Person类,那么Student的对象,即是一个Student也是Person。
表示:可以将子类(实现类)对象赋值给该类的引用变量,也可以将子类(实现类)对象赋值给父类的引用变量。
代码的最终体现:父类的引用变量指向子类对象。
代码:Person p = new Student();//就像int x = (byte)4;
注:多态必须在继承的前体下。(普通继承,抽象类,接口)

多态的具体情况

  • 类继承普通类

    class Fu{
    
      }
      class Zi{
          public static void main(String[] args) {
              Fu fu = new Zi();
          }
      }
  • 类继承抽象类

    abstract class Fu{
    
    }
    class Zi extends Fu{
        public static void main(String[] args) {
          Fu fu = new Zi();
          }
    }
  • 实现类实现接口

    interface Fu {
      }
      class Zi implements Fu{
      public static void main(String[] args) {
          Fu fu = new Zi();
          }
      }

多态下的成员特点

  • 编译时期:必须在父类中也有该成员的前提下才能调用,否则编译失败。
  • 运行时期:使用的是父类的成员变量。
  • 简单记:编译看左边,运行也看左边。

成员方法

  • 编译时期:必须在父类也有该成员方法的前提下才能调用,否则编译失败
  • 运行时期:使用的是子类重写后的成员方法
  • 简单记:编译看左边,运行看右边

如果编程父类了,就不能调用子类独有方法。必须变为子类才能调用子类的方法。

继承的方法,父类会调用子类继承重写的方法。

转型

向上转型

子类对象赋值给父类引用变量,多态本身就是向上转型的过程。
格式:

父类/接口 f = new 子类/实现类();

向下转型

在向上转型后,可以通过强制类型转换,将父类引用变量转换成子类引用变量。
格式:

Fu f = new Zi();

Zi z = (Zi)f;

注:

  1. 如果没有向上转型,直接使用父类对象转换成子类变量,会发生ClassCastException(类型转换异常)。不存在父子关系也没有向上转型就想向下转型会报错,因为它没有下线。
  2. 如果已经向上转型了,但是多态时的子类类型与强转后的类型不一致,也会发生ClassCastException(类型转换异常)。即转换成了不是原先自己的无关类,因为它的下线错了。

instanceof

  • 功能:
    判断对象是否属于指定类型
    格式:

    对象 instanceof 类型

  • 结果的情况:
    1. 没有意义的比较
      非多态情况下或者任何一个子类与其父类的比较都是没有意义的
    2. 有意义的比较
      多态情况下,将父类的引用变量与任意一个子类类型作比较,如果向上转型的过程就是通过该子类创建的,则返回true;反之,则返回false。

总结

什么时候转型

  1. 向上:
    扩展功能时
  2. 向下:
    当要使用子类特有成员时

多态的好处和缺点

  • 好处:
    将子类对象赋值给父类变量,使用的是这个多态后的父类变量,所以隐藏了子类类型,提高了代码的扩展性
  • 缺点:
    只能使用父类中的成员,不能使用子类的特有成员,如果想要使用,必须向下转型才能使用

额外

多态向上转型中,变量重名是父类,方法重名用子类。父有变量和方法子没有,全用父的。子有变量和方法父没有用不能调用。除非向下转型。

上一篇:16_2.反射相关
下一篇:7-面向对象
网友评论