运行时实现Java的多态性

 更新时间:2006年10月13日 00:00:00   作者:  
运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态性的实现。

  一、通过继承中超类对象引用变量引用子类对象来实现

  举例说明:

  //定义超类superA
  class superA
  {
  int i = 100;
  void fun()
  {
  System.out.println(“This is superA”);
  }
  }
  //定义superA的子类subB
  class subB extends superA
  {
  int m = 1;
  void fun()
  {
  System.out.println(“This is subB”);
  }
  }
  //定义superA的子类subC
  class subC extends superA
  {
  int n = 1;
  void fun()
  {
  System.out.println(“This is subC”);
  }
  }

  class Test
  {
  public static void main(String[] args)
  {
  superA a;
  subB b = new subB();
  subC c = new subC();
  a=b;
  a.fun(); (1)
  a=c;
  a.fun(); (2)
  }
  }

  运行结果为:

  This is subB
  This is subC

  上述代码中subB和subC是超类superA的子类,我们在类Test中声明了3个引用变量a, b, c,通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。也许有人会问:“为什么(1)和(2)不输出:This is superA”。java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

  所以,不要被上例中(1)和(2)所迷惑,虽然写成a.fun(),但是由于(1)中的a被b赋值,指向了子类subB的一个实例,因而(1)所调用的fun()实际上是子类subB的成员方法fun(),它覆盖了超类superA的成员方法fun();同样(2)调用的是子类subC的成员方法fun()。

  另外,如果子类继承的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性。具体的实现方法同上例。

  不过,抽象类的子类必须覆盖实现超类中的所有的抽象方法,否则子类必须被abstract修饰符修饰,当然也就不能被实例化了。

相关文章

  • 如何在jsp界面中插入图片

    如何在jsp界面中插入图片

    这篇文章主要介绍了如何在jsp界面中插入图片,文章通过示例代码和运行结果图介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • JSP 多条SQL语句同时执行的方法

    JSP 多条SQL语句同时执行的方法

    这是一段基本的SQL插入语句,分别将两个值插入到两个表中,上面的程序已经能够完成这一需求,但是实际操作中并不建议这样写
    2009-02-02
  • java使用smartupload组件实现文件上传的方法

    java使用smartupload组件实现文件上传的方法

    这篇文章主要介绍了java使用smartupload组件实现文件上传的方法,对比分析了使用组件与不使用组件实现文件上传的区别,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • JSP实现的简单Web投票程序代码

    JSP实现的简单Web投票程序代码

    这篇文章主要介绍了JSP实现的简单Web投票程序代码,较为详细的分析了JSP实现投票功能的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • jsp+servlet简单实现上传文件功能(保存目录改进)

    jsp+servlet简单实现上传文件功能(保存目录改进)

    这篇文章主要介绍了jsp+servlet简单实现上传文件(保存目录改进),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • JSP页面传值乱码过滤方法

    JSP页面传值乱码过滤方法

    这篇文章主要介绍了JSP页面传值乱码过滤方法,以完整实例形式分析了JSP页面传值的乱码过滤代码与配置方法,需要的朋友可以参考下
    2016-04-04
  • Jsp真分页实例---分页

    Jsp真分页实例---分页

    假分页每次只取需要的数据返回给客户端,比起真分页没有那么大的数据库压力。但也因为这个工作特性,所以假分页的方法需要频繁和服务器端进行交互。既然频繁交互,自然也会给服务器带来负担
    2017-04-04
  • 惊现支撑1亿pv/天的超级数据库解决方案

    惊现支撑1亿pv/天的超级数据库解决方案

    我说的系统主要是构建在hibernate之上的高效数据库缓存系统,其中包含了分布式解决方案,该系统已经应用在舍得网上了,没有发现大问题,
    2008-07-07
  • 安装resin+mysql+IIS+JDK的总结

    安装resin+mysql+IIS+JDK的总结

    安装resin+mysql+IIS+JDK的总结...
    2006-10-10
  • JBuilder2005单元测试之创建测试固件

    JBuilder2005单元测试之创建测试固件

    这篇文章主要介绍了JBuilder2005单元测试之创建测试固件
    2006-10-10

最新评论