`

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动态给我们指向具体的对象并调用相应的属性和方法.

分享到:
评论

相关推荐

    Java语言中的 覆盖重载和多态

    Java语言中的覆盖重载和多态,方法的多态,类型的多态,多态的优点,覆盖(override)识别标志,方法的重载,构造函数的重载,重载的好处,重载与覆盖的比较,编译时多态和运行时多态

    day10_07面向对象的基本特征三:多态.avi

    面向对象的基本特征三:多态的理解(java) * 多态:多种形态 * * 变量的引用形式: * (1)本态引用:左边的变量与右边的对象是同一种类型 * (2)多态引用:左边的变量是... * 强调:多态和属性无关,只说方法

    java实验报告(2)-多态和继承

    Java,面向对象编程的第二站--多态和继承,包含一个实验报告word文档(内包括体会和程序简介)和一个源代码压缩包(在Myeclipse 6.0下编译通过)

    DuoTai.java

    最近在复习JAVA相关基础知识,在编译时多态和运行时多态-多态-转型 这一块有一点小问题和思考,这是具体思考以及相关练习的源代码。 因为该处产生的错误为运行时异常,故编译时看不出来报错,干脆整个试验一下,此处...

    Java-多态与接口综合案例_USB接口设计

    多态用一句话概括就是:事物在运行过程中存在不同的状态。。多态的存在有三个前提: 1.要有继承关系 2.子类要重写父类的方法 3.父类引用指向子类对 综合实际应用,我们做出以下总结: ① 成员变量 编译看左边(父类),...

    Java期末考试真题试卷及复习资料【高级编程】

    Java期末考试真题试卷及... 多态 答Java引用变量分为编译时的类型和运行时的类型编译时类型由声明该变量时使用的类型决定运行时类型由实际赋给该变量的对象决定如果两类型不一致就出现多态 3.阻塞 答当前正在执行的线

    Java多态中的动态绑定与静态绑定

    1.动态绑定(auto binding):也叫后期绑定,在运行时,虚拟机根据具体对象的类型进行绑定,或者说是只有对象在虚拟机中创建了之后,才能确定方法属于哪一个对象,与引用变量实际引用的对象绑定,调用重写的方法,由...

    java技术学习文档.docx

    Java的代码块包括静态代码块、实例代码块和构造代码块,它们会在程序运行时被执行。Java中的异常处理机制可以帮助开发人员避免程序运行时出现的错误。 Java编程环境 Java编程环境包括Java开发工具(IDE)和Java开发...

    java面试真题整理

    编译时的多态:方法重载(个数、类型、顺序) 2.运行时多态:重写,对象的多态性(父类的引用指向子类的实例) 5.CSDN 1.泛型的好处 保护类型安全 避免强制类性转化 2.final 1.修饰的属性是常量 2.修饰的方法...

    (JAVA 版本的 官方经典PHash算法).zip

    它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持Java的任何平台上无需重新编译即可运行,这得益于其独特的跨平台性,通过Java虚拟机(JVM)...

    java基础面试题目详解

    核心,包括了 Java 运行环境 JRE、Java 工具和 Java 基础类库。Java Runtime Environment(JRE)是运行 JAVA 程序所必须的环境的集合,包含 JVM 标准实 现及 Java 核心类库。JVM 是 Java Virtual Machine(Java ...

    Java语言程序设计实验指导书

    1 Java运行环境 通过在不同环境编译运行一个Java编程环境,认识Java程序结构。 2 Java语言基本语法 编写程序,练习使用Java控制结构,实现循环嵌套与选择嵌套等复杂结构。 3 对象和类 编写程序实现类和对象的操作...

    史上最全java名词解释

    由于 JVM 的跨平台特性,Java 程序可以在各种操作系统和硬件平台上运行,而不需要重新编译。 Package: 在 Java 中,package 是一种用于组织和管理类的机制。它是一个命名空间,可以包含一组相关的类、接口和 其他包...

    Java复习大纲面试题.doc

    JRE:Java Runtime Enviorment Java运行时环境 区别:开发JAVA程序必须安装JDK,运行JAVA程序必须安装JRE。 3.为什么说JAVA语言的跨平台的?JAVA虚拟机JVM是跨平台的吗? 因为JAVA程序编译后生成的字节码文件(class...

    java核心基础汇总.docx

    异常处理:Java中的异常处理机制可以捕获并处理程序运行时出现的异常情况,提高程序的可靠性和稳定性。 线程:Java中的线程是一种轻量级的执行单元,可以并发执行多个任务,提高程序的效率。 输入输出:Java中的输入...

    java数据结构和算法实现.zip

    它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持Java的任何平台上无需重新编译即可运行,这得益于其独特的跨平台性,通过Java虚拟机(JVM)...

    关于学习笔记整理,包括Linux、Java、数据结构和算法,和一些IT工具的使用.zip

    它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持Java的任何平台上无需重新编译即可运行,这得益于其独特的跨平台性,通过Java虚拟机(JVM)...

    Java 和 js 实现 AES 和 RSA 算法的互加解密.zip

    它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持Java的任何平台上无需重新编译即可运行,这得益于其独特的跨平台性,通过Java虚拟机(JVM)...

Global site tag (gtag.js) - Google Analytics