先放一下多态的定义:

(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. 那些有实力进入 BAT 的本科生,都做对了什么事?

    作者:黄小斜 文章来源:微信公众号[黄小斜] 最近这段时间,我们部门来了几个年纪轻轻的本科生,最小的比我们小五岁左,这对于我来说还是比较有冲击力的. 想想我也是九0出头的老腊肉了,想当年我上大学的时候 ...

  2. c++二分查找

    c++二分查找 题目是在一些数字里找出一个数字,并输出他在第几行 代码 + 注释 #include <stdio.h> #include<iostream> using nam ...

  3. golang开发:类库篇(三)命令行工具cli的使用

    为什么要使用命令行 觉得这个问题不应该列出来,又觉得如果初次进行WEB开发的话,可能会觉得所有的东西都可以使用API去做,会觉得命令行没有必要. 其实,一个生产的项目命令行是绕不过去的.比如运营需要导 ...

  4. Android native进程间通信实例-socket本地通信篇之——基本通信功能

    导读: 网上看了很多篇有关socket本地通信的示例,很多都是调通服务端和客户端通信功能后就没有下文了,不太实用,真正开发中遇到的问题以及程序稳定性部分没有涉及,代码健壮性不够,本系列(socket本 ...

  5. idea环境下push项目

    1,选中需要推送的项目: 2,VCS-git-add 添加到本地仓库 3,vcs-commit 提交 4.commit and push 推送到远程仓库 出现错误这是提示程序有错误或者是TODO代码没 ...

  6. ElasticStack学习(七):ElasticSearch之Mapping初探

    一.Mapping的概念 1.Mapping类似于数据库中的Schema的定义,作用如下: 1)定义索引中的字段的名称: 2)定义字段的数据类型,例如字符串.数字.日期.布尔等: 3)对每个字段进行倒 ...

  7. MyBatis从入门到精通:select用法进一步讲解

    selectAll:笔记 /* 定义接口方法的返回值的时候,必须注意查询SQL可能返回的结果数量.当 返回值最多只有一个结果的时候,可以将结果返回值定义为SysUser,此时 返回值类型为List&l ...

  8. Vue根据不同的路由文件实现打包差异化

    有些时候我们经常一个项目中开发不同的功能,有可能一个前端项目中夹杂着不同系统之间的需求,最后打包发布的时候经常会将与项目不相关的代码一同打包进去,实际来讲这种操作也是不严谨的.那有没有办法可以根据某些 ...

  9. 双剑合璧——掌握 cURL 和 Dig 走天涯

    如今随着大量的应用转移到网络,作为开发者,会经常做一些通讯测试,例如从网站获取信息.模拟用户向网站提交或者上传数据,查看应用通讯情况等等,现在变成了非常重要的任务. 一起来认识 cURL cURL 是 ...

  10. 【弱化版】【P3371 【模板】单源最短路径(弱化版)】-C++

    →原题传送门← 看到题目描述我就知道,这道题不能用SPFA[手动补滑稽] 那么我这道题目采用的是dijkstra算法不了解的去补一下知识哈. dij的模板: #include<bits/stdc ...