先放一下多态的定义:

(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. SQL Server Form子查询、链接查询

    所用数据表:用户,钱包,订单 一.from子查询 --查询钱包里金额大于30000 and User_ID = Users.ID) ) 二.链接查询 内连接(inner join)外连接(left/r ...

  2. GStreamer基础教程04 - 动态连接Pipeline

    摘要 在以前的文章中,我们了解到了2种播放文件的方式:一种是在知道了文件的类型及编码方式后,手动创建所需Element并构造Pipeline:另一种是直接使用playbin,由playbin内部动态创 ...

  3. Spark 的 python 编程环境

    Spark 可以独立安装使用,也可以和 Hadoop 一起安装使用.在安装 Spark 之前,首先确保你的电脑上已经安装了 Java 8 或者更高的版本. Spark 安装 访问Spark 下载页面, ...

  4. MYSQL语句强化练习

    之前发现自己写sql不怎么得心应手,总是百度零零散散的学习一下,所以在空闲的时候自己就专门找一下mysql的强化题敲一下练习一下,简要记录一下,sql写着写着就会越来越熟练,总之要自己加油! 表结构 ...

  5. [HNOI2012]矿场搭建 题解

    [HNOI2012]矿场搭建 时间限制: 1 Sec  内存限制: 128 MB 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出 ...

  6. 微信小程序开发--组件(3)

    一.radio <radio-group class="radio-group" bindchange="radioChange"> <lab ...

  7. Java虚拟机知识点【内存】

    运行时数据区 程序计数器(Program Counter)   每个线程独占自己的程序计数器.如果当前执行的方式不是native的,那程序计数器保存JVM正在执行的字节码指令的地址,如果是native ...

  8. KafKa 发消息到Storm

    通过kafka客户端发送数据,由KafkaSpout进行接收消息,传输到ConsumerBolt进行实时数据处理. maven依赖 <dependencies> <!-- https ...

  9. LiteDB源码解析系列(3)索引原理详解

    在这一章,我们将了解LiteDB里面几个基本数据结构包括索引结构和数据块结构,我也会试着说明前辈数据之巅在博客中遇到的问题,最后对比mysql进一步深入了解LiteDB的索引原理. 1.LiteDB的 ...

  10. XTTS系列之一:U2L迁移解决方案之XTTS的使用

    本系列的定位是对XTTS及相关技术进行深入的学习研究.作为本系列的开篇,本着实用性的原则,我先把一次实际生产环境U2L的迁移实战实施方案进行提炼简化,旨在能清楚说明该如何使用XTTS这种解决方案来进行 ...