zoukankan      html  css  js  c++  java
  • JAVA的多态

    本文为读<Java编程思想>后所作的读书笔记, 转载请注明出处

      封装, 继承, 和多态是面向对象编程的三大特性, 而多态是其中相对比较难以理解的一种,特此介绍:

      假设有两个类A和B,其中A为基类,B为A的子类,两个类都包含一个run()方法:

      public class A{

      public void run(){System.out.println("A");};

     }

      public class B extends A{

      public void run(){System.out.println("B");}

    }

      我们可以通过一下方法得到一个B的对象:

      A b=new B();

      这时执行b.run();会输出什么呢? 很显然,我们期待的是"B",而实际上正确的输出也是"B".

      同理,若此时还有一个继承自A的子类C,其中有一个run()方法:

      public class C extends A{

      public void run(){System.out.println("C");}

    }

      当我们通过以下方法创建一个C的对象并调用起run()方法:

      A c=new C();

      c.run();

      执行的结果是"C".

      这就是多态的作用:分离做什么和怎么做.虽然b和c都调用了相同名字的方法run(),但是JAVA却能够在运行时正确的调用其相应子类的方法,而不是其基类的方法.也就是说:b.run()或者c.run()仅仅是告诉b和c对象要执行一个名字叫run()的方法,但是具体要调用的到底是A,还是B和C中的run()方法实体,编程者无需指定,JAVA会在运行时动态的将正确的run()方法的实体绑定到run()的方法调用.然后就会产生正确的结果.这种绑定方法称作"运行时绑定"或者"动态绑定".

      另外,在JAVA中除staticfinal方法以外其他方法都是动态绑定.由于private方法属于final方法,构造器方法是隐式的static方法,所以这两种方法不具有多态性,当执行上面的例子时,若run()方法是static的或者final的,则输出只会是"A".

      任何对域,也就是成员变量的访问都不是多态的,因为访问是在编译期进行的.

  • 相关阅读:
    js如何判断访问来源是来自搜索引擎(蜘蛛人)还是直接访问
    thinkphp AOP(面向切面编程)
    crontab命令详解 含启动/重启/停止
    直播协议的选择:RTMP vs. HLS
    说一下PHP中die()和exit()区别
    宝塔Linux常用命令
    阿里云Redis公网连接的解决办法
    DMA及cache一致性的学习心得 --dma_alloc_writecombine【转】
    DMA内存申请--dma_alloc_coherent 及 寄存器与内存【转】
    内核中container_of宏的详细分析【转】
  • 原文地址:https://www.cnblogs.com/kemaswill/p/Sunow.html
Copyright © 2011-2022 走看看