先放一下多态的定义:

(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. scrapy基础知识之发送POST请求:

    可以使用 yield scrapy.FormRequest(url, formdata, callback)方法发送POST请求. 如果希望程序执行一开始就发送POST请求,可以重写Spider类的s ...

  2. 用Supervisor实现进程守护,在异常退出时自动重启

    程序启动后,有些是以daemon的形式运行,但在意外退出后,如果不能及时重新启动,会有比较严重的影响. 比如Zimg在图片处理中由于某些图片处理失败,会导致zimg进程挂掉,影响正常的服务提供,并且只 ...

  3. Java 代码界 3% 的王者?看我是如何解错这 5 道题的

    前些日子,阿里妹(妹子出题也这么难)发表了一篇文章<悬赏征集!5 道题征集代码界前 3% 的超级王者>——看到这个标题,我内心非常非常激动,因为终于可以证明自己技术很牛逼了. 但遗憾的是, ...

  4. Spring Boot日志使用

    前言: 这是我第一次仔细研究Spring Boot相关的知识,就拿日志下手了,欢迎大家指点 Spring Boot日志关系 这个是Spring Boot的启动器,我们点击spring-boot-sta ...

  5. BZOJ4152 The Captain(dijkstra+巧妙建图)

    BZOJ4152 The Captain 题面很简洁: 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 很明显 ...

  6. 【基本数据结构之堆】-C++

    注意:这篇博客讲的是手写堆,喜欢用C++自带数据结构模拟的慎入 今天我们来聊一聊一种奇怪 的数据结构: 堆 为什么说这个数据结构有点奇怪呢? 先看看其他的在我眼里是正常的数据结构: 队列(近似于排队) ...

  7. [笨方法学Python]ImportError"No module named bin.app"【笔记】

    运行nosetests时,出现:ImportError"No module named bin.app" 解决方法: 1.检查路径是否是bin/app.py 2.检查是否创建bin ...

  8. Vue杂谈

    <div id="app"> <input type="text" ref="input1"/> <butto ...

  9. CF356E - Xenia and String Problem

    也许更好的阅读体验 \(\mathcal{Description}\) 定义一种字符串\(gray\)串满足: 长度为奇数 正中间的字母只出现一次 左右两端相同,左右两端也是gray串 一个\(gra ...

  10. 【css系列】六种实现元素水平居中方法

    一.前言 居中效果在CSS中很是普通的效果,平时大家所看到的居中效果主要分为三大类:水平居中.垂直居中和水平垂直居中.而其中水平居中相对于后两者来说要简单得多.使用了css3的flexbox的属性轻松 ...