当前位置:  编程技术>java/j2ee

运行时实现Java的多态性

    来源: 互联网  发布时间:2014-10-15

    本文导语:  运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下...

运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。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修饰符修饰,当然也就不能被实例化了。

    
 
 

您可能感兴趣的文章:

  • expect实现telnet远程主机后,运行程序问题
  • LINUX下如何实现开机后自动运行WebSphere?
  • 使用JavaScript实现的Flash运行环境 Gordon
  • 我在虚拟终端运行VI,如何实现语法加亮呀?????
  • 开发板运行交互式网页,控件包含linux命令,用什么方法实现?
  • 如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么?应该怎么实现?
  • java怎样实现 运行dos命令行的命令或者windows的程序
  • linux下如何实现让程序自动运行呢?
  • 如何重复运行一个应用程序(shell实现,在线等......)
  • 如何用c shell实现让一个a.exe在后台运行,请给出shell代码
  • linux下如何实现程序异常退出自动再运行
  • 在unix下写一个每日批处理的程序,如何实现每日某个时间触发我要运行的代码?
  • VC++实现程序开机启动运行的方法
  • 使用mutex实现应用程序单实例运行代码分享
  • 有关gdb调试问题 如何实现让一个循环运行给定数目的次数(或条件满足停止)
  • 用linux做服务器运行ASP.net网站,请问具体怎样实现??
  • C#程序自动以管理员方式运行的实现方法
  • c语言如何实现只运行单个进程实例?
  • ping的C实现方式 运行之后出现 socket:Permission denied,是什么问题
  • Android中设置只有程序第一次运行才显示的界面实现思路
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • SecureCRT上运行一个JAVA程序,该程序类似一个在WINDOWS下一直运行的CMD窗口的东西,SecureCRT关掉后,JAVA还会继续运行吗?
  • 在docker容器中运行hello world!
  • 如何运行外部命令后不等外部命令运行结束直接运行下一条命令
  • 通过docker ps命令检查运行中的docker镜像
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 通过docker run命令运行新的docker镜像
  • 用Jbuilder3 遇到问题不能运行把可疑代码注掉后可以运行但是重新使用可疑代码时又可以运行了多次重复都是如此
  • 安装运行微软win7/Windows7系统要求及官方下载地址
  • “模块”在内核中运行与作为单独进程运行在机制上有什么区别与联系?
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • telnet到主机去运行一个我编的程序,退出telnet时那个程序也不运行了,这是怎么回事?按程序逻辑它应该一直运行下去的。
  • Ubuntu程序开机自动启动设置(服务和自动运行配置文件)的几种方法
  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • ​Windows Server 2016提供Docker原生运行的企业级支持
  • tomcat下servlet无法运行,但是jsp可以运行,在线等待。。。
  • windows下cmd命令提示符下让程序后台运行命令
  • 请教为什么要运行一个可执行文件要以./文件名 的形式来运行?
  • 请问怎么改配置文件啊?能运行startx启动XWindow,运行X就不行呢?
  • 问一个crontab中不能运行手动可以运行的问题
  • 中断恢复现场时怎样判断进程运行到那一步,如何无缝连续运行的呢?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3