面向对象的继承和多态(is-a)
继承的主要作用:我们使用继承主要是为了避免出现重复的定义,程序中如果出现多个地方有相同的定义,可以把相同程序提取出来定义为父类。
子类继承父类使用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)的更多相关文章
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- javascript面向对象:继承、多态
继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属性),同时可扩展自己的成员,下面介绍几种js中实现继承的方式: 1,对象模仿:通过动态的改变 this 指针的指向,实现 ...
- python学习第十五天 -面向对象之继承和多态
大家都知道面向对象的三大特性:封装,继承,多态.封装特性在上一章节已经讲解过.这一章节主要讲解继承和多态. 继承: 当定义一个类的时候,可以从现有的类进行继承.那么新定义的类可以称为子类,被继承的现有 ...
- Day7 初识面向对象,面向对象之继承、多态和封装
一.面向对象引言 一.面向对象的程序设计的由来 详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二.面向对象引子 写一个简单程序 ...
- php 面向对象之继承、多态和静态方法
<?php //继承:子类可以继承父类的一切 //特点:单继承 //父类 class Ren { public $name; public $sex; public $yuyan; functi ...
- Python面向对象:继承和多态
继承与多态简介: 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写. 动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的. ...
- Java:[面向对象:继承,多态]
本文内容: 继承 多态 首发时期:2018-03-23 继承: 介绍: 如果多个类中存在相同的属性和行为,可以将这些内容抽取到单独一个类中,那么多个类(子类)无需再定义这些属性和行为,只要继承那个类( ...
- Python 面向对象编程——继承和多态
<基本定义> 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超 ...
- python 面向对象(三)--继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
- python 面向对象四 继承和多态
一.继承 class Animal(object): def run(self): print('Animal is running...') class Dog(Animal): def run(s ...
随机推荐
- eslint 验证vue文件 报错 unexpected token =解决方法
解决方案:.eslintrc更改文件配置 { "extends": [ 'standard' ], "parserOptions": { "parse ...
- Ant Design Vue select下拉列表设置默认值
在项目中需要为Ant Design Vue 的 select 组件设置一个默认值,如下图所示的状态下拉选择框,默认选择全部 代码如下: <a-select v-model="query ...
- Linux删除含有特殊符号文件名的文件
1. 文件名含有特殊字符,直接使用 rm 可能删除不了,可以使用如下方法: 1) 使用 ls -i 查处该文件的 inode 号,假设为123 2) 使用find命令删除: rm `find . ...
- mysql常用处理时间的相关函数
1.DATE_ADD() 函数向日期添加指定的时间间隔 DAY) AS OrderPayDate FROM Orders 2.DATE_SUB() 函数从日期减去指定的时间间隔 DAY) AS Sub ...
- Charles4.2.8抓包(http+https)
Charles 和 Fiddler 一样都是http抓包工具. 之前用 Fiddler 抓个别 ios 手机 https 报文时总卡在哪里返不回任何数据,后来怀疑是 Fiddler 问题,就考虑使用 ...
- go 学习笔记(3) 基础结构
package main import ( "fmt" ) const NAME string = "imooc" var a string = "慕 ...
- Unity的学习笔记(鼠标移动控制视角移动)
using UnityEngine; public class MouseLook : MonoBehaviour { , MouseX = , MouseY = } //定义一个枚举,移动xy,或者 ...
- 基于工作组消息队列高可用&msmq-wcf故障
场景: msmq 1# server故障手工切换到2# server,msmq-wcf service宿主服务重启后,无法成功读取消息,状似service不工作.无法监听到数据传输. 解决过程: 反复 ...
- Mybatis中三种关联关系的实现
目录 一对一查询 一对多查询 自关联查询: 多对多查询 总结: 三种关联关系:一对多,一对一,多对多 两种查询方式:嵌套查询,连接查询(也可称作:多表单独查询,多表连接查询) 每一种关联关系都可以通过 ...
- Bad state: Stream has already been listened to.
https://stackoverflow.com/questions/51396769/flutter-bad-state-stream-has-already-been-listened-to T ...