zoukankan      html  css  js  c++  java
  • 多态

    概述

    我们都知道面向对象有四个基本特性:抽象、封装、继承、多态。这四个特性,概括起来可以这么理解,抽象、封装、继承是多态的基础,多态是抽象、封装、继承的表现。多态,是Java中非常重要的一个部分,所以今天来谈一下多态(Polymorphism)。

    什么是多态

    不同类的对象对同一消息作出不同的响应就叫做多态。就像上课铃响了,上体育课的学生跑到操场上站好,上语文课的学生在教室里坐好一样。

    多态的作用

    简单讲就是解耦。再详细点讲就是,多态是设计模式的基础,不能说所有的设计模式都使用到了多态,但是23种中的很大一部分,都是基于多态的。

    多态存在的三个条件

    1、有继承关系  

    2、子类重写父类方法  

    3、父类引用指向子类对象

    补充一下第二点,既然多态存在必须要有“子类重写父类方法”这一条件,那么以下三种类型的方法是没有办法表现出多态特性的(因为不能被重写):

    1、static方法,因为被static修饰的方法是属于类的,而不是属于实例的

    2、final方法,因为被final修饰的方法无法被子类重写

    3、private方法和protected方法,前者是因为被private修饰的方法对子类不可见,后者是因为尽管被protected修饰的方法可以被子类见到,也可以被子类重写,但是它是无法被外部所引用的,一个不能被外部引用的方法,怎么能谈多态呢

    多态的分类

    1、编译时多态,即方法的重载,从JVM的角度来讲,这是一种静态分派(static dispatch)

    2、运行时多态,即方法的重写,从JVM的角度来讲,这是一种动态分派(dynamic dispatch)

    关于这一点,在写到JVM的时候会详细讲到

    分析多态问题的几条原则

    如果不去理解多态的原理,就从使用的角度来讲,以个人的学习、工作这几年的经验,总结出了多态无非就是三句话:

    比如我们有一个父类Father,有一个子类Children

    1、向上转型是自动的。即Father f = new Children()是自动的,不需要强转

    2、向下转型要强转。即Children c = new Father()是无法编译通过的,必须要Children c = (Children)new Father(),让父类知道它要转成具体哪个子类

    3、父类引用指向子类对象,子类重写了父类的方法,调用父类的方法,实际调用的是子类重写了的父类的该方法。即Father f = new Children(),f.toString()实际上调用的是Children中的toString()方法

    不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在方法调用之前,编译
    器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到方法调用的那一刻
    ,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。 
     
     

    后记

    多态是Java语言体系中最基础、最重要的概念,工作中哪里都有用到,必须好好地将它理解透了。另外,本篇文章是本人博客园发的第一篇文章,希望以后写出更多更好、更有质量的文章。

  • 相关阅读:
    PowerDesigner使用教程(一)
    为自己的博客园增加打赏功能[只需五步]
    [Python自学] DRF (4) (权限组件和频率组件)
    [Python自学] DRF (3) (认证组件)
    [Python自学] DRF (2) (视图类的封装)
    [踩坑] Django "OverflowError: Python int too large to convert to C long" 错误
    [Python自学] DRF (1)
    [Python自学] 设计模式之单例模式
    [Python自学] Django的admin组件
    [Python自学] Django的认证系统
  • 原文地址:https://www.cnblogs.com/lchzls/p/7278024.html
Copyright © 2011-2022 走看看