java如何继承两个类?以及讨论一下多继承的利弊。
java中一个类不能直接继承两个类比如说这样: class A extends B,C 不能这样写,因为java不支持多继承, 但是你可以像下面这样实现继承多个类 class A extends B class C extends A 这样C就同时继承了B和A两个类
在C++看来,这个多继承就好解决多了
class A{public:virtual void foo(){printf("A")}}; calss B{public:virtual void foo(){printf("B")}}; . . . class x:public A,public B,... {void foo(){printf("X");}; }
知乎上对多继承有比较详细的回答:https://www.zhihu.com/question/21476063
class A:def save(self): pass
class B(A): pass
class C:def save(self): pass
class D(B, C): pass
作为D类的一个实例,它的成员寻找顺序是:D、B、A、C。
但当碰到如下这样一个“菱形继承”就麻烦了:
class A:def save(self): pass
class B(A): pass
class C(A):def save(self): pass
class D(B, C): pass
作为D类的一个实例,寻找顺序也是D、B、A、C,但调用其save方法时,到底是调用A中的呢?还是C中的呢?直观上看,应该是C。这里有产生矛盾了。
2. Python2.2的new-style class模式
Python2.2中引进了new-style class,说白了就像java一样,所有类都继承自最根本的object类。
这就让“菱形继承”变成十分普遍,于是只能改变MRO策略。
仍然使用深度优先搜索、从左向右,但是每个类选择其最后一次出现的位置。
这样一来,对上面的“菱形继承”就处理比较完美了,形成的顺序是:D、B、C、A,越是公用基础类,越放在后面。
但是,碰到交叉继承,就又懵了。
<img src="https://pic4.zhimg.com/d067bccb353065c3276a96f6aab93a77_b.jpg" data-rawwidth="113" data-rawheight="179" class="content_image" width="113">这里,X和Y都继承自O,A继承(X,Y)(注意,有先后顺序),B继承(Y,X),再有个最下面的类继承(A,B)。这里,X和Y都继承自O,A继承(X,Y)(注意,有先后顺序),B继承(Y,X),再有个最下面的类继承(A,B)。
按照上述算法出来的结果是:?、A、B、Y、X、O。这就有些奇怪了,明明A在B前,A继承的X在Y前,可为啥X的优先级比Y要低呢?
3. C3算法
1996年,一帮牛人写了一篇文章A monotonic superclass linearization for Dylan,提供了一个基于层级计算的线性MRO算法,被称为C3,整体上比较合理了。(算法不详说了)
在2012年被加入了Dylan语言,2007年加入了Python2.3,此外还有Perl 6、Parrot等语言之中。
这样虽说基本解决了计算问题,但多重继承本身就有很多让人疑惑的地方,比如:
<img src="https://pic4.zhimg.com/c1e6e9a3a1df789b9686582a9367326b_b.jpg" data-rawwidth="251" data-rawheight="171" class="content_image" width="251">参考文献:参考文献:
http://python-history.blogspot.jp/2010/06/method-resolution-order.html
The Python 2.3 Method Resolution Order
============================================
第二部分:
多重继承那么复杂,可单一继承又那么拘束,咋办呢?
1. 接口继承
Java就是那么做的,只允许单一继承类(方法的实现),但可以继承多个接口(方法的定义)。
Java的接口继承功能,既实现了静态语言的多重继承性,又避免了多重继承的数据构造的冲突和类层次的复杂性。
但是,我们并不能说接口是解决问题的完美方案。接口也有不能共享实现的缺点。
本来只是为了跨越继承层次来共享代码,现在却需要另外生成一个独立对象,而且每次方法调用都要委派给这个对象,这实在是不太合理,而且执行的效率也不高。
——《松本行弘的程序世界》
2. Mix-in
这是Ruby所推崇的,最初在Lisp中开始使用。规则如下:
- 通常的继承都是单一继承。
- 第二个以及两个以上的父类必须是Mix-in的抽象类(即不能单独生成实例,不能继承普通类)。
这种规则下,既能够保持单一继承的结构,又能用Mix-in来共享方法的实现。
java如何继承两个类?以及讨论一下多继承的利弊。相关推荐
- java源程序分为两大类_java源程序分为两大类
答案:D 您的答案:D 题目分数:2.0 此题得分:2.0 13.第 19 题 Java Application 源程序的主类是指包含有( )方法的类 A.main 方法 B.toString 方法 ...
- java源程序分为两大类_根据程序运行的环境不同,JAVA源程序分为两大类,那两个类?-----并解析什么意思...
根据程序运行的环境不同,JAVA源程序分为两大类,那两个类?-----并解析什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来 ...
- python一个类继承多个类_如何让Python继承多个类?一文读懂Python类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过Python类的继承并且在此基础上衍生出让Python继承多个类的方法. 通过Python类的继承创建的新类称为子类或派生类, ...
- Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式
一.继承的概念及用法 继承背后的思想就是 基于已存在的类来构建新类 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...
- java类继承语法_java类的继承(基础)
---恢复内容开始--- 这篇随笔和大家讲讲java中类的继承是什么?希望对你们有所帮助. 目录 一.java继承是什么? 二.为什么使用java继承 三.java继承的实现 1.1 java继承的 ...
- Java类的继承学生研究生类图_UML part3 类图、对象图
UML part3 类图.对象图 四种关系 1. 依赖关系 ①定义:依赖描述了两个模型元素之间的关系,如果被依赖的模型元素发生变化就会影响到另一个模型元素 ②举例:动物有生命和水进行繁殖,动物和水,动 ...
- java用继承编写宠物乐园_MoreThanJavaDay 5:面向对象进阶继承详解
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- Java SE(六)之面向对象(封装,继承,多态,接口)
文章目录 类和对象 1. 创建一个类 2. 创建一个对象 3. 访问变量和方法 4. some tips 封装 修饰符 1. 访问控制修饰符 2. 非访问修饰符 (1)static (2)final ...
- 诚之和:Java基础知识枚举Enum类介绍以及案例使用详解
Java语言中的数据类型可以分为两大类,分别是基本数据类型和引用数据类型.本篇文章要介绍的枚举,就是属于Java的引用数据类型.下面,将为大家详细介绍Java中的枚举,以及具体的使用案例. 一.文章序 ...
最新文章
- 华为的鸿蒙系统营销,全球第一款搭载华为鸿蒙系统的荣耀智慧屏终端在万众期待中正式上线销售...
- angular2 php 教程,有关Material在Angular2中的使用(详细教程)
- S4HANA里至关重要的建模方式CDS view架构介绍
- CRM, C4C和Hybris的工作流简介
- 算法设计与分析——回溯法——批处理作业调度
- C++vector容器-容量和大小
- P1903-[国家集训队]数颜色/维护队列【带修莫队】
- 没事聊聊C++局域网聊天软件
- 中国程序员生存现状:颜值是择偶第一标准!
- Spring Cloud Config Server
- Entity Framework 6 Recipes 2nd Edition(11-5)译 - 从”模型定义”函数返回一个匿名类型...
- git add remote_Git常用命令
- git 为什么不能断点_Git 2.29 让 Git 成功“牵手”Gerrit
- 最长回文字串--动态规划
- 美团搜索多业务商品排序探索与实践
- 【scratch音乐课】天空之城:音符与节拍、消息与链表
- 有哪些文艺而有韵味的句子?
- 荐书丨《好奇心的秘密》:一个针尖上可以站多少跳舞的小天使?
- 微信撤回消息为何要提示对方?腾讯解答真相
- 为硬件保留的存储空间怎么释放出来?
热门文章
- 软件工程专业大学生的一年半 | 2022年度总结
- 华为如何在开发者选项观察错误日志_爬虫scrapy框架--log日志输出配置及使用
- pic16f1829 c语言,PIC16F1829 串口初始化程序及应用
- php mail 垃圾邮件,如何避免我的邮件从PHP邮件()被标记为垃圾邮件? - 程序园
- Java常用设计模式-策略模式
- java画bezier曲线_java 画的4个点的Bezier曲线
- word标题前自动分页
- Oracle--“ORA-28007: the password cannot be reused”解决
- Pytorch识别手写体数字的简单实现
- HTML自学笔记-1(进入篇)