多态的作用就是用来将接口和实现分离开,改善代码组织结构,增强代码可读性,便于代码的维护。

  在java中,讨论多态就是讨论方法调用的绑定,绑定就是将一个方法调用同一个方法主体联系起来。在java中通常叫做“运行时绑定”,也称“后期绑定”。例如:

1.定义一个基类

public class Parents{

  public void print(){

    System.out.println("parents");

  }

}

2.定义两个派生类

public class Mother extends Parents{
  @Override
  public void print(){
    System.out.println("Mother");
  }
  //无法重写父类被static或final修饰的方法
  //这里相当于创建了一个全新的tell()方法
  public static void tell(){
    System.out.println("static for mother");
  }
}

public class Father extends Parents {
  @Override
  public void print(){
    System.out.println("Father");
  }
}

3.测试类

public class Test {

  public void find(Parents p){
    p.print();
  }
  public static void main(String[] args) {
    Test test = new Test();
    Mother mother = new Mother();
    test.find(mother);
  }

}

最后输出的是mother,将派生类的引用传给基类的引用,然后调用重写方法,基类的引用之所以能够找到应该调用的那个派生类的方法,就是因为程序在运行时进行了绑定。

多态的关键注意点

1.java中除了static 和 final方法外,其他所有的方法都是运行时绑定的。其中private方法都被隐式指定为final的,因此final方法不会在运行时绑定。当在派生类中重写基类中的static,final或private方法时,实质上是创建了一个新的方法。

2.在派生类中,对于基类的private方法,最好采用不同的名字。

3.包含抽象方法的类叫做抽象类。注意定义里面包含这样的意思,只要类中包含一个抽象方法,该类就是抽象类。抽象类在派生中就是作为基类的角色,为不同的子类提供通用的接口。

4.对象清理的顺序和创建的顺序相反,当然前提是自己手动清理对象,因为大家都知道java垃圾回收机制。

5.在基类的构造方法中小心调用基类中的被重写的方法,这里涉及到对象初始化顺序。

6.构造方法是被隐式声明为static方法。

7.用继承表达行为间的差异,用字段表达状态上的变化。

如何理解Java多态性?

通过类型转换,把一个对象当作它的基类对象对待。从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行相同的处理。这些不同派生类的对象响应同一个方法时的行为会有所差异的,这正是这些相似的类之间的区别。

动态绑定

将一个方法调用和一个方法主体连接到一起称为绑定(Bindings).

根据绑定的时机不同,分为“早期绑定”和“后期绑定”.

如果程序运行之前进行绑定(有编译器和链接程序完成)-->早期绑定;

如果在程序运行期间进行绑定,称为"后期绑定",后期绑定也称为 动态绑定 或 运行时绑定;

在java中,多态性是依靠动态绑定实现的,即java虚拟机在运行时确定要调用哪一个同名方法。

多态的应用

由于多态性,一个父类的引用变量可以指向不同的子类对象,并且在运行时根据父类引用变量所指向对象的实际类型执行相应的子类方法。

利用多态性进行二次分发。

利用多态性设计回调方法。

java-面向对象的多态性摘要的更多相关文章

  1. JAVA面向对象的多态性

    什么是多态?简而言之就是相同的行为,不同的实现. 而多态也分为静态多态(重载).动态多态(重写)和动态绑定. 静态动态,实际就是指的重载的概念,是系统在编译时,就能知晓该具体调用哪个方法.动态多态指在 ...

  2. Java面向对象_多态性、instanceof关键字

    一.多态 分类:方法的重载与重写:对象的多态性 对象的多态性:向上转型:将子类实例转为父类实例   格式:父类 父类对象=子类实例;是自动转换 向下转型:将父类实例转为子类实例   格式:子类 子类对 ...

  3. Java面向对象——三大特性

    Java面向对象——三大特性 摘要:本文主要介绍了面型对象的三大特性. 封装 什么是封装 封装,就是指一个类隐藏了对象的属性和实现细节,对自己的数据和方法进行访问权限控制,只允许某些类和对象进行访问和 ...

  4. Java面向对象设计主要有三大特征:封装性、继承性和多态性

    Java面向对象设计主要有三大特征:封装性.继承性和多态性 一  封装性   1.1  概念:它是将类的一些敏感信息隐藏在类的类部,不让外界直接访问到,但是可以通过getter/setter方法间接访 ...

  5. Java面向对象-对象的多态性

    Java面向对象-对象的多态性 Java中的多态性表现: 1,方法的重载和重写(覆盖): 2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现: 我们先搞个父类Animal: ...

  6. JAVA面向对象-多态的理解

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

  7. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  8. Java面向对象的多态

    Java中多态的概念是面向对象中除封装和继承外非常重要的知识点,也是Java面向对象三大特性最后一个特性 多态其实就是指对象存在的多种形态,多态分为引用多态和方法多态 引用多态的含义就是:父类的引用可 ...

  9. Java面向对象的三大特征

    Java面向对象的三大特征 java面向对象的三大特征:“封装.继承.多态”.更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. ...

  10. Java面向对象详解

    Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...

随机推荐

  1. MSSQL和MYSQL数据库降权

    在服务器上如果是 system 用户在运行 MySQL ,这个是非常危险的,一旦Mysql 出现漏洞,或被其他模式提权,直接就是 system 权限.所以我们现在要给MySQL降权! 作用:增强服务器 ...

  2. 关于Kafka区分请求处理优先级的讨论

    所有的讨论都是基于KIP-291展开的.抱歉,这又是一篇没有图的文字. 目前Kafka broker对所有发过来的请求都是一视同仁的,不会区别对待.不管是用于生产消费的PRODUCE和FETCH请求, ...

  3. 为何GET只发一次TCP连接,POST发两次TCP连接

    GET和POST是HTTP请求的两种基本方法,要说他们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  4. Ubuntu16.04首次root登录设置

    一.首次登录root模式设置 当第一次安装并登录Ubuntu16.04系统时,系统默认只能使用guest模式登录.登录系统后,在图像界面的右上方的系统设置中可转换为普通用户模式. 在普通登录模式下,经 ...

  5. window alias给cmd命令起别名

    场景: Linux的alias命令是个非常实用的工具,任何命令通过alias可以精简到很短,比如:alias l='ls -l' Windows也有alias类似的命令,就是:doskey,开启方法也 ...

  6. Hibernate HQL一对多 在一方的查询

    首先说一句:是版本的问题! 在多对多或者多对一,从一中查找多中查询某些语句时容易出现 我写的hql为: from Department as d where d.employees.name='Tom ...

  7. spring boot中的jave注解学习

    在spring中,不仅框架作者会使用java注解,开发者也常使用. 可以随手给个例子:在org.springframework.boot.autoconfigure.jdbc.DataSourcePr ...

  8. postgresql数据库和mysql数据库的对比分析

    1.Posgresql是进程模式,多进程,单线程,类似的还有Oracle.而MYSQL采用的是线程模式,单进程,多线程,对此,大家在运行数据库的时候可以查看任务管理器,SQL Server也是如此. ...

  9. oracle编码转换:AL32UTF8->ZHS16GBK

    --修改Oracle数据库字符集为utf-8: SQL>conn / as sysdba; SQL>shutdown immediate; SQL>startup mount; SQ ...

  10. ajax方式提交表单数据并判断当前注册用户是否存在

    项目的目录结构 源代码: regservlet.java package register; import java.io.IOException; import java.io.PrintWrite ...