继承的主要作用:我们使用继承主要是为了避免出现重复的定义,程序中如果出现多个地方有相同的定义,可以把相同程序提取出来定义为父类。

子类继承父类使用extends关键字,子类具备父类所有的属性和方法,包括私有方法,只不过子类对父类的私有方法和成员没有访问权限,除非父类对外提供了访问的接口(get、set)方法。

子类可以自己扩充行为,也可以对父类的方法进行重写。

--------------------------------------------------------------------------

多态与is-a:

继承除了可以避免重复定义行为外,还有一个重要的关系-is-a,理解了这种关系有利于我们对多态的理解。

假设我们开发一个RPG游戏,有三个类分别为Role、SwordsMan、Magician,这三类父类是Role,后两者为子类。我们看看以下代码是否能通过编译:

SwordsMan swordsMan=new SwordsMan();
Magician magician=new Magician();

上面的代码能通过编译,我们从右往左使用is-a关系来进行判断,右边是不是一种左边,看看是否能通过编译。SwordsMan是一种SwordsMan,Magician是一种Magician,代码逻辑没有问题。

Role role1=new SwordsMan();
Role role2=new Magician();

同理,我们判断SwordsMan是一种role,Magician也是一种role,逻辑上没有问题。

Magician magician=new Role();
SwordsMan swordsMan=new Role();

上面的代码能够通过编译吗?Role不一定是Magician,Role也不一定是SwordsMan,所以没有通过编译。

通过上面的三个例子我们可以知道,编译器会进行“是一种”判断,如果我们不想让第三种情况出现编译错误,我们可以使用向下转型,让编译器住嘴,表明我们想创建的Role就是向下转型的子类。代码如下:

Role role=new Magician();
Magician magician=(Magician)role;//向下转型

但是上面的向下转型可能会出现运行错误,是因为向下转型出现错误,代码如下:

Role role=new Magician();
SwordsMan swordsMan=(SwordsMan)role;

上面两行代码编译没有问题,但在运行时会报ClassCastException错误。

----------------------------------------------------------------------------------------------------------------------------------------------

什么叫做多态?

一种抽象解释是单一接口操作不同类型的对象,我们对一个接口方法定义得对象参数为一个父类,我们传入的参数可以为父类的任何子类,但是不同的子类对象会有不同的行为发生。这就是多态。

有关于多态的知识点可以参考这篇博文:

https://www.cnblogs.com/xdp-gacl/p/3644035.html

父类的引用访问不了子类的成员,只能够访问子类的重写方法。

面向对象的继承和多态(is-a)的更多相关文章

  1. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  2. javascript面向对象:继承、多态

    继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属性),同时可扩展自己的成员,下面介绍几种js中实现继承的方式: 1,对象模仿:通过动态的改变 this 指针的指向,实现 ...

  3. python学习第十五天 -面向对象之继承和多态

    大家都知道面向对象的三大特性:封装,继承,多态.封装特性在上一章节已经讲解过.这一章节主要讲解继承和多态. 继承: 当定义一个类的时候,可以从现有的类进行继承.那么新定义的类可以称为子类,被继承的现有 ...

  4. Day7 初识面向对象,面向对象之继承、多态和封装

    一.面向对象引言 一.面向对象的程序设计的由来 详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二.面向对象引子 写一个简单程序 ...

  5. php 面向对象之继承、多态和静态方法

    <?php //继承:子类可以继承父类的一切 //特点:单继承 //父类 class Ren { public $name; public $sex; public $yuyan; functi ...

  6. Python面向对象:继承和多态

    继承与多态简介: 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写. 动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的. ...

  7. Java:[面向对象:继承,多态]

    本文内容: 继承 多态 首发时期:2018-03-23 继承: 介绍: 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类( ...

  8. Python 面向对象编程——继承和多态

    <基本定义>     在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超 ...

  9. python 面向对象(三)--继承和多态

    在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...

  10. python 面向对象四 继承和多态

    一.继承 class Animal(object): def run(self): print('Animal is running...') class Dog(Animal): def run(s ...

随机推荐

  1. setInterval定时器停止后,再重新启动

    1.数据自动滚动显示(动态添加) <li> <div class="FULeTi"> <div class="SLeName"&g ...

  2. laravel迁移文件中字段方法对应的数据库类型

    /* *Blueprint类中的方法方法 <-> 数据库数据类型 * */ // 数字 increments();// int(10) unsigned primarykey auto_i ...

  3. 解决sublime text3运行PyQt5代码不能显示窗口的问题

    如题,在sublime中写了GUI代码,Ctrl+B能运行,但是就是不能显示窗口. 解决办法:  找到路径C:\Users\superlee\AppData\Roaming\Sublime Text ...

  4. Matplotlib:绘图和可视化

    Matplotlib:绘图和可视化 简介 简单绘制线形图 plot函数 支持图类型 保存图表 一 .简介 Matplotlib是一个强大的Python绘图和数据可视化的工具包.数据可视化也是我们数据分 ...

  5. 数组中重复的数字(Python)

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019-08-13 22:35 # @Author : daryl # @File : ...

  6. Dubbo快速入门 一

    1.分布式基础理论 1.1).什么是分布式系统? “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distributed system)是建立在网络之上的软件 ...

  7. 解决Ubuntu 16.04 环境下Python 无法显示中文的问题

    一.下载中文字体(https://pan.baidu.com/s/1EqabwENMxR2WJrHfKvyrIw 这里下载多是SImhei字体) 安装字体:解压:unzip SimHei.zip拷贝字 ...

  8. 保研经验帖----江西师范大学 to 华中科技大学

    呼,距离拿到华科cs的offer也有一段时间,有好几次准备动手写这篇经验帖,但就是理不清自己想表达什么,今早起来状态还不错,洗漱的时候思路居然通透了,哈哈哈~ 一.基本情况 先简单介绍笔者的一些基本情 ...

  9. Flutter 与 Android 的交互

    https://juejin.im/post/5cd91de4518825686b120921 https://juejin.im/entry/5b64292be51d451995676398

  10. Java 之 Stream 流

    Stream流 在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端 一.传统遍历 1.传统集合的多步遍历代码 几乎所有的集合(如 ...