当前位置: 首页 > news >正文

java的编译时多态和运行时多态

1、运行时多态和编译时多态的区别?
编译时的多态,是指参数列表的不同, 来区分不同的函数, 在编译后, 就自动变成两个不同的函数名. 在运行时谈不上多态
运行时多态:用到的是后期绑定的技术, 在程序运行前不知道,会调用那个方法, 而到运行时, 通过运算程序,动态的算出被调用的地址. 动态调用在继承的时候,方法名 参数列表完全相同时才出现运行时多态!
运行时多态,也就是动态绑定,是指在执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型判断并调用相应的属性和方法.看看下面这个例子:
abstract class Animal {
  private String name;
  Animal(String name) {this.name = name;}
  /*
  public void enjoy(){
    System.out.println("叫声......");//父类方法,下面的子类对该方法不满意,重写.
  }
  */
  public abstract void enjoy();//该方法没有实现的必要(所以我们一般声明为静态方法),但有定义的必要.
}

class Cat extends Animal {
  private String eyesColor;
  Cat(String n,String c) {super(n); eyesColor = c;}

  public void enjoy() {
    System.out.println("猫叫声......");
  }
 
  //public abstract void enjoy();//如果不想实现父类静态方法,可将此方法声明为静态的,该类也同时为abstract
}

class Dog extends Animal {
  private String furColor;
  Dog(String n,String c) {super(n); furColor = c;}

  public void enjoy() {
    System.out.println("狗叫声......");
  }
}

class Bird extends Animal {
         Bird() {
                  super("bird");
         }
         public void enjoy() {
    System.out.println("鸟叫声......");
  }
}

class Lady {
    private String name;
    private Animal pet;
    Lady(String name,Animal pet) {
        this.name = name; this.pet = pet;
    }
    public void myPetEnjoy(){pet.enjoy();}
}

public class Test {
    public static void main(String args[]){
        Cat c = new Cat("catname","blue");
        Dog d = new Dog("dogname","black");
        Bird b = new Bird();
        //Lady l1 = new Lady("l1",c);
        Lady l2 = new Lady("l2",d);
        Lady l3 = new Lady("l3",b);
       //l1.myPetEnjoy();
        l2.myPetEnjoy();
        l3.myPetEnjoy();
    }
}
动态绑定的底层实现是指针,我们知道程序中的方法是一段代码,存放在专门的内存区域中(code segment---代码区),当我们在程序执行期间new 出一个对象后调用enjoy方法的时候,JVM动态的把指针指向实际的对象重写的方法,从而实现了动态绑定.
动态绑定的最大好处就是给我们的程序的可扩展性带来了相当大的提高(上面的例子中我们可以继续添加子类或是在main方法中new  lady,),如果没有动态绑定,我们一般情况下的做法是在子类中用instanceof判断一个对象是不是我们需要的当前具体对象,但当我们定义好多个子类的时候,每次都要判断,现在有了动态绑定,我们不需要再去判断,而是JVM动态给我们指向具体的对象并调用相应的属性和方法.

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tophot115/archive/2008/10/04/3016033.aspx

相关文章:

  • java多态的实现机制
  • DOM Tree
  • Java 动态代理机制分析
  • powershell递归删除文件
  • Java 静态代理和动态代理
  • 【Python开发】Python之re模块 —— 正则表达式操作
  • 《深入浅出 Java Concurrency》—并发容器 ConcurrentMap
  • 不需内测账号,带你体验微信小程序完整开发过程
  • java synchronized与lock区别
  • 深入剖析Java编程中的中文问题及建议最优解决方法
  • linux系统安装php扩展
  • 从Decorator,Adapter模式看Java/IO库
  • 【神经网络与深度学习】什么是HDF
  • java内存模型分析
  • 博客园站内短消息XSS
  • [译]如何构建服务器端web组件,为何要构建?
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Apache Pulsar 2.1 重磅发布
  • HTTP那些事
  • leetcode388. Longest Absolute File Path
  • Linux gpio口使用方法
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Vim Clutch | 面向脚踏板编程……
  • 百度小程序遇到的问题
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 工程优化暨babel升级小记
  • 简单易用的leetcode开发测试工具(npm)
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 双管齐下,VMware的容器新战略
  • 一道闭包题引发的思考
  • hi-nginx-1.3.4编译安装
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #git 撤消对文件的更改
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (+4)2.2UML建模图
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (转)创业家杂志:UCWEB天使第一步
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET gRPC 和RESTful简单对比
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET开发不可不知、不可不用的辅助类(一)
  • @DataRedisTest测试redis从未如此丝滑
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ C++ ] STL_vector -- 迭代器失效问题
  • []FET-430SIM508 研究日志 11.3.31
  • [20160902]rm -rf的惨案.txt
  • [Angularjs]ng-select和ng-options
  • [asp.net core]project.json(2)