首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

(18) 为什么说继承是把双刃剑 计算机程序的思维逻辑

继承没有反映"is-a"关系 继承关系是被设计用来反映"is-a"关系的,子类是父类的一种,子类对象也属于父类,父类的属性和行为也一定适用于子类。...但现实中,设计完全符合"is-a"关系的继承关系是困难的。比如说,绝大部分鸟都会飞,可能就想给鸟类增加一个方法fly()表示飞,但有一些鸟就不会飞,比如说企鹅。...在"is-a"关系中,重写方法时,子类不应该改变父类预期的行为,但是,这是没有办法约束的。...继承是应该被当做"is-a"关系使用的,但是,Java并没有办法约束,父类有的属性和行为,子类并不一定都适用,子类还可以重写方法,实现与父类预期完全不一样的行为。...混乱。 如何应对继承的双面性? 继承既强大又有破坏性,那怎么办呢?

1.1K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python OOP-2

    ,也叫基类,也叫超类 - 用与继承的类,叫子类,也叫派生类 - 继承与被继承一定存在一个 is-a 关系 - 继承的特征 - 所有的类都继承自object类,即所有的类都是object...可以在定义新方法的同时访问父类成员来进行代码重用 可以使用 [父类名.父类成员] 的格式来调用父类成员,也可以使用[super().父类成员]的 格式来调用 - 继承变量函数的查找顺序问题...- 传承有序逻辑清晰语法简单隐患少 - 功能不能无限扩展,只能在当前唯一的继承链中扩展 - 多继承: - 优点:类的功能扩展方便 - 缺点:继承关系混乱...- 菱形继承/钻石继承问题 - 多个子类继承自同一个父类,这些子类又被同一个类继承, 于是继承关系图形成一个菱形图谱 - [MRO](https://www.cnblogs.com..._petname) # 私有访问问题 # 公开访问私有变量,报错 # print(t.

    41487

    【JavaSE】面向对象三大特征——封装、继承、多态

    no B 是一种 A,那么B 就继承了 A 能通过is-a 测试,在逻辑上和程序中就能顺利的使用继承关系 拿猫叫狗叫动物叫举例,比如现在Dog和Cat类继承了Animal类 然后来看一下这三段代码的编译结果...,前两段代码通过了is-a 测试,自然是没有问题,而第三段代码就没有通过is-a测试,所以编译失败。...测试导致编译失败 编译器会检查父子类之间的is-a关系。...不是,这在逻辑上说不过去,程序中也不应该让苹果继承动物类,否则会导致程序的整体逻辑混乱 当然你完全可以让Apple extends Animal,但这样是完全不合理的 作为开发者应当避免这种乱继承的行为...总结: is-a 帮助我们判断父子类的关系 has-a 帮助我们判断类与成员变量的关系 多态 三大特性的最后一个,也是最重要的一个。多态顾名思义:多种形态,听起来有点抽象。

    26410

    Java千百问_05面向对象(006)_is-a,has-a,like-a是什么

    1、is-a,has-a,like-a是什么 在面向对象设计的领域里,有若干种设计思路,主要有例如以下三种: is-a、has-a、like-a java中在类、接口、抽象类中有非常多体现。...了解java看这里:什么是Java 了解类和对象看这里:类、对象究竟有什么秘密 了解接口和抽象类看这里:接口和抽象类有什么差别 2、is-a是什么 is-a。顾名思义,是一个。代表继承关系。...因此在用Java语言实现时,应该将PC机和工作站定义成两种类,均继承计算机类。 了解很多其它继承看这里:java类的继承有什么意义 3、has-a是什么 has-a,顾名思义。有一个。...代表从属关系。 假设A has a B,那么B就是A的组成部分。 同一种类的对象,通过它们的属性的不同值来差别。...5、is-a,has-a,like-a怎样应用 假设你确定两件对象之间是is-a关系,那么此时你应该使用继承。比方菱形、圆形和方形都是形状的一种。那么他们都应该从形状类继承。

    38940

    java编程思想第八章多态

    8.2转机(主要是介绍如何实现多态)   为了解决多态问题,在java中提供了后期绑定的方法,即在运行时根据对象的类型进行绑定。也成为动态绑定或运行时绑定。   ...千万不能通过final来提高性能,因为并不会提升性能,而且也会让程序的设计显得混乱。   多态可以让程序员将:改变的事物与未变的事物分离开来。   ...纯继承与扩展:   纯继承是is-a关系:基类可以接受发送导出类的任何消息,因为二者有着完全相同的接口。我们只需要从导出类向上转型,永远不需要知道正在处理的对象的确切类型。   ...对于这种类型,在向上转型时的问题就在于,扩展部分不能被基类访问。   为了解决向上转型中,无法识别扩展部分,提出了向下转型的概念。   但是有可能出现的问题:你不知道到底要转成哪个类型。...实际上在java中每一次转型都会的得到检查,称之为“运行时类型识别”(RTTI)。

    37330

    由学习《软件设计重构》所想到的代码review(二)

    Paste_Image.png 注:通过上图咱们看到了在层次结构中有九大问题点,咱们就从中找出四个典型的问题点给与分析和解释。...Paste_Image.png 三、支离破碎的层次结构 这种层次结构主要体现在,虽然超类和子类之间不存在is-a关系,但是超类的方法对于子类来说是适用或者相关的。 问题点: ?...java.sql.Date不支持与时间有关的功能,而java.sql.Time不支持与日期有关的功能,于是java.sql.Date拒绝了从超类继承的所有与时间有关的方法,java.sql.Time拒绝了继承的所有与日期有关的方法...看一段简单的代码: java.util.Date date = new java.util.Date(); int dateValue = date.getDate(); //不报错,一切正常 date...is-a关系,它们在设计中使用继承只是为了能够利用抽象提供的功能,其实在相关类之间建立关联关系也可以达到这样的目的,采用重构手法”以委拖取代继承”,应用hash-a的关系取代is-a关系

    44620

    【翻译】Golang语言-是面向对象语言吗?

    单继承关系是一棵树,而多继承关系是一个格状结构。单继承语言包括PHP、C#、Java、Ruby等,多继承语言包括Perl、Python、C++等 多态 多态是is-a关系,继承是实现的复用。...多态定义了两个对象的语义关系,继承定义两个对象的语法关系。 对象组合 对象组合是一个对象包含了其他对象,而非继承,它是has-a的关系,而非is-a。 go语言的继承 go有意得被设计为没有继承语法。...实际上go的这种设计是一种非常好的解决方法,它解决了围绕着继承的数十年的老问题和争论。...接口能用于函数(方法)的输入输出中,因而可以在类型之间建立起is-a关系。 go语言定义一个接口并不是使用using关键字,而是通过在对象上定义方法来实现。...通过组合(composition),has-a关系来最小化代码重用,并且避免了继承的缺陷。go使用接口(interface)来建立类型(type)之间的is-a关系

    1.8K80

    「MoreThanJava」Day 5:面向对象进阶—继承详解

    Java 通过使用单继承避免了这些问题。(意思 Java 只允许单继承) is-a 关系 ? 上图显示了一个父类 (Video 视频类),一个子类 (Movie 电影类)。...它们之间的实线表示 "is-a" 的关系:电影是视频。 注意,继承是在类之间,而不是在对象之间。...类之间的关系简述 简单地说,类和类之间的关系有三种:is-a、has-a 和 use-a。...is-a 关系也叫继承或泛化,比如学生和人的关系、手机和电子产品的关系都属于继承关系; has-a 关系通常称之为关联,比如部门和员工的关系、汽车和引擎的关系都属于关联关系;关联关系如果是整体和部分的关联...上面说到,继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。我们通过一个例子来说明一下。

    51410

    面向对象四大特性

    抽象实现方式 抽象可以通过接口类(如Java的interface关键字语法)或者抽象类(Java中的abstract关键字语法)这两种语法机制来实现。...Java中abstract class表示的是"is a"关系,interface表示的是"like a"关系。 抽象存在的意义 修改实现不需要改变定义。...继承 继承用来表示类之间的is-a关系,分为两种模式:单继承和多继承。 单继承表示一个子类只能继承一个父类,多继承表示一个子类可以继承多个父类。...这一点也并不是继承所独有的,我们也可以通过其他方式来解决这个代码复用的问题,比如利用组合关系而不是继承关系 人类认知的角度上来说,是一种 is-a 关系。...而像 Java 这样的静态语言,通过继承实现多态特性,必须要求两个类之间有继承关系,通过接口实现多态特性,类必须实现对应的接口。

    71810

    SOLID之LSP

    这个测试违反了OCP,因为此时f对于B的所有派生类都不再是封闭的 IS-AIS-A”是严格的分类学意义上的定义,意思是一个类是另一个类的“一种” 我们经常说继承是IS-A关系,也就是如果一个新类型的对象被认为和一个已有类的对象之间满足...IS-A关系,那么这个新对象的类应该从这个已用对象的类派生 从一般意义上讲,一个正方形就是一个矩形。...关系是就行为方式而言,而不是属性,这也就是面向接口编程;派生类的行为方式和输出不能违反基类已经确立的任何限制。...基类的用户不应该被派生类的输出扰乱 简单判断就是“可替换性”,子类是否能替换父类并保持原有行为不变 LSP与架构 LSP从诞生开始,也就差不多这些内容,主要是指导如何使用继承关系的一种方法。...随着时间推移,在更宏观上,LSP逐渐演变成了一种更广泛的、指导接口与其实现方式的设计原则 可以是java风格的接口,具有多个实现类:甚至可以是几个服务响应同一个rest接口,用户都依赖于一种接口,并且都期待实现该接口的类之间能具有可替换性

    67430

    面向对象特点

    ---- 编程是为了解决现实生活中复杂的计算和存储问题的; 而现实生活中,各个事物是非常复杂的,如果都想用编程来表达,那么仅仅靠Java的8种基本数据类型是做不到的,所以就需要更完善的结&...这门语言可以轻松的帮我们实现这种工作; 基于Java语言的这种强大的能力,我们给他命名为Java是面向对象(事...;、继承、多态; 学习Java编程就是搞清楚面向对象的这4个特点,然后灵活运用Java编程解决现实生活中的问题; 一、抽象 编程的目的就是将现实世界的事物...有效地调节性能: 可以通过剖析确定哪些模块影响了系统的性能; 4、提高软件的可重用性; 5、降低了构建大型系统的风险: 即使整个系统不可用,但是这些独立的模块却有可能是可用的; 三、继承 继承实现了 IS-A...(是一个) 关系,例如 冰冰 和 人 就是一种 IS-A 关系; 继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象; 1、面向对象最重要的特点之一,就是可以实现对类的复用; 2、通过“继承”

    27320

    详细解析Java中抽象类和接口的区别

    首先,abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系(因为Java不支持多继承 — 转注)。但是,一个类却可以实现多个interface。...前面已经提到过,abstract class在Java语言中体现了一种继承关系,要想使得 继承关系合理,父类和派生类之间必须存在”is-a关系,即父类和派生类在概念本质上应该是相同的。...前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系 在本质上是”is-a关系。所以对于Door这个概念,我们应该使用abstarct class方式来定义。...其 实abstract class表示的是”is-a关系,interface表示的是”like-a”关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解 上的,比如:如果我们认为AlarmDoor...其实abstract class表示的是”is-a关系,interface表示的是”like-a”关系。 4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。

    59010

    这一篇让你彻底搞懂 JAVA内部类

    本文将会从以下几部分来总结: 为什么要存在内部类 内部类与外部类的关系 内部的分类及几种分类的详细使用注意事项 实际开发中会遇到内部类的问题 # 1....内部类与外部类的关系 对于非静态内部类,内部类的创建依赖外部类的实例对象,在没有外部类实例之前是无法创建内部类的 内部类是一个相对独立的实体,与外部类不是 is-a 关系 创建内部类的时刻并不依赖于外部类的创建...# 2.2 内部类是一个相对独立的实体,与外部类不是 is-a 关系 首先理解什么是「is-a 关系」:is-a 关系是指继承关系。...知道什么是 is-a 关系后相信,内部类和外部类不是 is-a 关系就很容易理解了。...总结 本文从内部类的存在理由,内部类与外部类的关系,内部类分类以及开发中内部类可能造成的内存泄漏的问题上,总结了与内部类相关的问题,原谅本人才疏学浅,本文之前想要使用「彻底搞懂 java 内部类」但是当我写完整片文章

    22520

    软考高级: UML 依赖、关联、泛化、聚合概念和例题

    作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》...泛化关系中的类具有“是一个”(is-a)的关系。 4. 实现(Implementation) 实现关系用于表示类与接口之间的关系。当一个类实现一个接口时,它必须实现接口中定义的所有方法。...实现 “是一个”(is-a关系在UML中通常用来表示哪种关系? A. 关联 B. 聚合 C. 泛化 D....一本书和它的页面 解析:页面不能脱离书存在,这是一个典型的组合关系例子。 答案: D. 实现 解析:接口和实现类之间的关系是通过实现关系来表示的,类必须实现接口中定义的所有方法。...依赖 解析:如果A可以独立于B存在,但在某些功能上需要B,那么这是依赖关系。 答案: C. 泛化 解析:“是一个”(is-a关系用来表示继承关系,即泛化关系。 答案: B.

    30600

    总结Java关系

    什么是关系关系是指事物之间存在单向或双向的作用或者影响的状态。其中类与类之间要么有关系要么没关系,感觉这句话有点说的很无耻,谁都知道,但是其中奥妙在于很难确定类与类之间是否有关系。...证明两个或者多个类是否存在关系涉及到业务、架构、模块边界的问题,然而由于业务模型的抽象角度不同而不同,确定他们是否有关系是一件很不简单的事情。...Java类有关系的6种情况 继承:extends【is-a】 实现:implements【can do】 组合:类是成员变量【contain-a】 聚合:类是成员变量【is-a】 依赖:是除了组合与聚合外的单向弱关系...聚合: 关联关系的一种特例,是整体和部分的关系,即has-a的关系。整体和部分之间是可分离的,拥有各自的生命周期。 和组合关系的整体和部分关系不同的是:该整体包含很多个部分,但这里的部分都是相同的。...比如鸟群和鸟的关系是聚合关系,鸟群中每个部分都是鸟。由空心菱形和实线箭头表示。 组合关系: 也是关联关系的一种特例,它体现一种contains-a的关系,这种关系比聚合更强,也称为强聚合。

    69420
    领券