先放一下多态的定义:

(360词典上的哈)

多态(Polymorphism)按字面的意思就是"多种状态"。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述--多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4 编程技术内幕")。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针

看完上面的定义,可能你会觉得有点懵,其实也就是两句话:

1.一种事物的多种形态

2.父类引用指向子类对象

首先来解释第一点:

  多态是指的一种事务的多种形态。

说明一下抽象:

  抽象:忽略物体的实际属性的状态、个体的特殊行为等,忽略问题的表现,而关注问题的本质的一个过程。

比如说,我们每一个人都是一个个体。我们就可以把个体的特殊行为和特殊属性值忽略,而抽取每一个人的共性作为人这个类。

而我们实现对象的时候再把我们个体的这些特殊属性值为人这个类的属性赋值。而在类中,我们人这个类虽然有属性,却没有具体指。

为类的属性填值和改变具体行为的过程,被称为类的实现也就是建立一个对象。

简化为一句话哈(抽象是忽略个体实际而转化为一个类型的过程。实例化是将类型特殊化为一个个体的过程)

然后下一个概念是继承:(一定要理解昂)

  继承是将一个类型泛化为多个类型的过程,且子类型拥有(继承了)父类型所拥有的所有元素(所有非private类型的方法和变量)

  这句话的意思就是,这个类型又可以分为多个子类型,举个例子的话,人这个类型可以泛化为男人和女人这两个具体一点的类型。

首先说明一下上面的的继承所得到的东西:

我们之前的博文有讲到过类的加载机制,在static那一篇。

在一个对象的创建过程中的第二个阶段,指向非静态代码块和构造函数的时候我们也执行的父类的非静态代码块和构造函数函数,

这个过程是不是就表明,在创建一个类的时候,我们一定也会创建一个它所对应的父类(对于每个对象来说都是如此,所以其实Java创建一个对象,其实创建了好多个,显得特别臃肿)

而在我们每一个对象中都有一个super、this引用,super指向它的直接父类、this指向自己。(接下来会讲到)

类继承的时候会继承父类对象的的所有的非private修饰的成员变量和成员方法。

对于变量来说它实际上是把父类对象的可以继承的成员变量赋值了一份放在了自己这里。

但是对于成员变量来说则是各自有各自的区域,存储的是不同的成员变量,不过子类会拷贝一份父类的非private的成员变量。

对于方法来说,则不会继承父类的private成员方法,其它的方法子类继承了。但是如果自己写了一个除了方法体和父类的某个方法重名的方法(返回值类型可以不同,不过返回值类型必须是父类返回值类型的子类(多态)),则会覆盖父类的那个方法。

对于方法重写有两个注意事项:

子类的方法不能比父类的方法的访问权限小,抛出的异常不能比父类的大。(接下来讲)

接下来就该多态了:

我们说多态是一种事务的多种形态,其实就是说的我们的泛化,不过比泛化更具体一下,多态是,把泛化实例化了。就是把泛化的类型实例化了。

第二局是父类引用指向子类对象,则是多态的表现形式。它的意思是说,我们可以使用父类类型的引用指向子类类型的对象。(好好体会一下就懂了)

这就是多态了。用一种大类型来指向多种小类型,来描述事物类型之间的一种集合关系(同属于一种集合,但是又不是同一种类型,比如哺乳动物、人、狗狗)人和狗是哺乳动物的多种形态

接下来我们该说一下使用多态时应该注意的点。其实理解了上面的下面的就自己能想到了。

A 是父类  A1、A2是子类

A a = new A1()

使用多态时,调用(a.value)属性的时候,实际上是调用的a的父类型的属性,也就是A类型的,因为,人家会判断你的引用类型。

而使用a.str()方法时,则是使用的子类的方法,因为,在调用方法时,它不会去检查引用类型。直接调用的就是子类所拥有的方法。

对于静态方法和静态变量来说,则会检查引用类型。调用对应引用类型的类的静态变量和函数。(上面这三句话,一定要记住昂,除了方法之外,其它的都会检查引用类型)

讨论完继承、多态之后,我们还需要讨论一下this、super关键字。这个是在每个对象中都有的。

this是指向当前对象的一个引用,super是指向其父类对象的一个引用。

this()执行当前类的无参构造函数

super()执行父类的无参构造函数,

在类的无参构造函数的第一行默认调用了super()

this()\super()不能同时出现,原因自己想一下哦,我们总不可能初始化两次某个对象吧。

还有关于this、super的一个重要知识点,

this调用的是当前类的方法,super调用的也是它指向的父类的方法。(这里需要强调一下,虽然父类的方法被子类所覆盖的,但是这里指向的是父类的对象,所以是去父类的方法所存储的地方寻找对应的方法,而不是去this指向的子类的存储方法的地方寻找。我记得Java中的类的方法只有一份,我记得是这样啊,不是太确定。不过这个并不影响我们判断。寻找方法的时候是不判断引用类型,而是通过引用指向的对象,去这个对象的类型的方法集里找对应的,所以这里和子类的方法集无关,每一个类有一个方法集)

this 也用来分别成员变量和参数重名的情况

this 、super都不要在静态环境中使(变量、方法、代码块)用,他们都是在对象生成之后才有的

从本质上讲,this是一个指向本对象的指针,super是个关键字

super可以用来调用父类中被隐藏的方法和变量

super()必须卸载子类构造函数的第一行

this(参数)调用其它构造函数,也必须放在第一行

多态、继承、this、super的更多相关文章

  1. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  2. 01 语言基础+高级:1-4 接口与多态_day09【继承、super、this、抽象类】

    day09[继承.super.this.抽象类] 三大特性——继承方法重写super关键字this关键字抽象类 教学目标能够解释类名作为参数和返回值类型能够写出类的继承格式能够说出继承的特点能够说出子 ...

  3. java 封装多态继承

    java 面向对象思想 封装多态继承 面向过程与面向对象 编程分为面向对象编程和面向对象编程,汇编,C语言是面向过程写代码,C++/Java是面向对象 其实面向过程和面向对象在本质都是一样写代码,然后 ...

  4. 继承 派生 super()经典类 新式类

    '''1什么是继承? 继承一种新建类的方式,在python中支持一个儿子继承多个爹 新建的类称为子类的或者派生类 父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承 减少代码冗余 ...

  5. 多态(upcast)减少分支判断 以及 多态继承设计、具体类型判断。

    Influenced by <java 八荣八耻>,翻了下<java编程思想> 印象中多态产生的条件:1.子类继承父类 2.父类[指针]指向子类 3.父类引用调用重写(@Ove ...

  6. [python] 在 python2和3中关于类继承的 super方法简要说明

    下面举一个例子,同样的代码使用 python2 和 python3 写的,大家注意两段程序中红色加粗的部分: python2的类继承使用super方法: #-*- coding:utf-8 -*- ' ...

  7. python's twenty day for me 继承 和 super()方法

    super(): 在单继承中就是单纯的寻找父类. 在多继承中就是根据子节点所在图 的mro顺序,找寻下一个类. 遇到多继承和super(): 对象.方法 1,找到这个对象对应的类. 2,将这个类的所有 ...

  8. 继承、super、this、抽象类

    继承.super.this.抽象类 继承.super.this.抽象类 继承.super.this.抽象类 继承.super.this.抽象类 继承.super.this.抽象类

  9. 关于Python中的类普通继承与super函数继承

    关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...

  10. Python大神必须掌握的技能:多继承、super和MRO算法

    本文主要以Python3.x为例讲解Python多继承.super以及MRO算法. 1. Python中的继承 任何面向对象编程语言都会支持继承,Python也不例外.但Python语言却是少数几个支 ...

随机推荐

  1. Azkaban 3.73.1 使用简介

    本文上接<Azkaban 3.73.1 集群搭建(Multiple Executor)>,对Azkaban的使用做简单说明 目录 目录 简介 1. 登录 2. 创建工程 3. 创建job ...

  2. python 微信红包生成器

    #红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...

  3. TPL DataFlow .Net 数据流组件,了解一下

    回顾上文 作为单体程序,依赖的第三方服务虽不多,但是2C的程序还是有不少内容可讲: 作为一个常规互联网系统,无外乎就是接受请求.处理请求,输出响应. 由于业务渐渐增长,数据处理的过程会越来越复杂和冗长 ...

  4. 基数排序的可复用实现(C++11/14/17/20)

    基数排序,是对整数类型的一种排序方法,有MSD (most significant digit)和LSD (least significant digit)两种.MSD将每个数按照高位分为若干个桶(按 ...

  5. 安卓学习资料推荐《深入理解Android:卷2》下载

    下载地址:百度云下载地址 编辑推荐 <深入理解Android:卷2>编辑推荐:经典畅销书<深入理解Android:卷I>姊妹篇,51CTO移动开发频道和开源中国社区一致鼎力推荐 ...

  6. 不要天真了,这些简历HR一看就知道你是培训的,质量不佳的那种

    上到职场干将下到职场萌新,都会接触到包装简历这个词语.当你简历投到心仪的公司,公司内负责求职的工作人员是如何甄别简历的包装程度的?Jason 老师根据自己的经验写下了这篇文章,谁都不是天才,包装无可厚 ...

  7. python爬虫笔记之re.IGNORECASE

    re.IGNORECASE有什么用?re.IGNORECASE是什么意思?(原谅我抓下seo..) 这里自己总结下: re.IGNORECASE是compile函数中的一个匹配模式. re.IGNOR ...

  8. SP1805 HISTOGRA - Largest Rectangle in a Histogram 题解

    题目链接:https://www.luogu.org/problemnew/show/SP1805 分析: 我们可以用一个单调栈由低到高来存储它的高度,并用数组对每个高度记录一下它前面(包括它自己)一 ...

  9. 了解一下zookeeper,搭建单机版和集群版的环境玩玩,需要手稿的,留下邮箱

    第一章:Zookeeper介绍 Zookeeper,动物管理员,是用来管理hadoop(大象).Hive(蜜蜂).Pig(小猪)的管理员. Apache Hbase和Apache Solr的分布式集群 ...

  10. [leetcode]914. X of a Kind in a Deck of Cards (easy)

    原题 题目原意可转换为 两组有大于等于2的公因数 /** * @param {number[]} deck * @return {boolean} */ var hasGroupsSizeX = fu ...