Question: 基于接口的继承和基于实现的继承各有什么优缺点

接口的本质:

  • 协议,约定,能力. 接口这个概念在生活中并不陌生,电子世界中一个常见的接口就是USB接口。电脑往往有多个USB接口,可以插各种USB设备,可以是键盘、鼠标、U盘、摄像头、手机等等。接口声明了一组能力,但它自己并没有实现这个能力,它只是一个约定,它涉及交互两方对象,一方需要实现这个接口,另一方使用这个接口,但双方对象并不直接互相依赖,它们只是通过-接口间接交互

实现的本质:

  • 事物本身要做的具体功能,具体操作

继承的本质:

  • 对具体功能的扩展,泛化
  • 之所以叫继承是因为,子类继承了父类的属性和行为,父类有的属性和行为,子类都有。但子类可以增加子类特有的属性和行为,某些父类有的行为,子类的实现方式可能与父类也不完全一样。使用继承一方面可以复用代码,公共的属性和行为可以放到父-类中,而子类只需要关注子类特有的就可以了,另一方面,不同子类的对象可以更为方便的被统一处理。

基于接口的继承:

  • 优点:

    • 扩展灵活,代表协议层面的扩充. 可以在原接口上提供能力的扩展.
    • 接口的继承在降低耦合度方面有很好的作用,接口的继承不像实现的继承那样破坏封装.
  • 缺点:
    • 只是针对接口能力的扩展, 没有具体实现代码的复用. 具体可复用实现需要具体处理.

基于实现的继承:

  • 对原有实现的扩展,可以是父类的不同实现子类

  • 优点:
    • 子类可以复用父类代码,不写任何代码即可具备父类的属性和功能,而只需要增加特有的属性和行为。
    • 子类可以重写父类行为,还可以通过多态实现统一处理。
    • 给父类增加属性和行为,就可以自动给所有子类增加属性和行为。
    • 另一个是利用多态和动态绑定统一处理多种不同子类的对象
  • 缺点:
    • 破坏类封装,子类的的代码和父类耦合,如果子类不知道基类方法的实现细节,它就不能正确的进行扩展。
    • 降低代码灵活性,子类必须要有父类的的所有public方法,子类不再自由.
    • 侵入性,必须要有父类的所有方法

Question: 继承(包括 extend 和 implement)有什么【缺点】

  • extends 是继承一个具体实体类
  • implements 是继承一个接口.
    • 缺点:

      • 子类会依赖于父类存在无法解耦,父类的更改会影响子类

        • 父类新增方法
        • 父类删除方法
        • 子类脱离父类无法独立存在
      • 性能上会有影响,如果有十层继承,那么执行一个方法需要寻找十层
    • 优点:
      • 增加代码复用,重复的代码可以在父类中定义,子类可以很便利的调用
      • 覆盖,子类可以重写父类的实现
      • 扩展性,子类可以增加自己的实现
      • 接口会使得程序变得更加灵活
      • 隐藏数据,父类可以定义一些属性为private,这样子类就需要重定义

Question: 多态(polymorphism)有什么【缺点】?

  • 性能问题(这个比较轻微);
  • 比如在“实现继承”中的多态,可能会附带有继承的缺点。

Question: 为什么 Java 可以多继承 interface,而不可以多继承 class?

  • 菱形继承问题,若果a,b都有一个add方法.c多继承a,b; 那么c无法确定该用哪个父类的add方法.除了方法,变量也有这类问题.

Question: 假如让你写一个小游戏(比如人机对战的五子棋),你会如何设计类结构?

  • 棋盘(放置棋子接口/获取当前棋盘情况接口/和棋计算)

    • 虚拟棋盘

      • 棋位置的二维数组
  • 棋子
    • 白棋子
    • 黑棋子
  • 棋手(下棋接口)
    • 电脑
    • 人类

Question: 类结构设计时,如何考虑可扩展性?

我认为做到如下几点就可以保证扩展性了.

  • 单一职责原则:
    Single Responsibility Principle
  • 里氏替换原则:
    If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。)
  • 依赖倒置原则:
    Dependence Inversion Principle.High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
  • 接口隔离原则:
    Clients should not be forced to depend upon interfaces that they don't use; The dependency of one class to another one should depend on the smallest possible interface.
  • 迪米特法则:
    Least Knowledge Principle
  • 开闭原则:
    Software entities like classes, modules and functions should be open for extension but closed for modifications.

参考网址

  • 1.Inheritance Advantages and Disadvantages
  • 2.老马说编程

转载于:https://www.cnblogs.com/alcc/p/9201909.html

Java新手问题 02 面向对象基本功相关推荐

  1. AJPFX浅谈关于Java程序员缺乏面向对象的基本功的问题

    为什么很多 Java 程序员会缺乏面向对象基本功?这得怪那些 Java 框架.现在 Java 的各种框架太发达.太傻瓜化了,导致很多程序员只需要按部就班.照着框架进行代码填空,基本已经丧失了 OOA ...

  2. java 01 02_Java知识系统回顾整理01基础02面向对象01类和对象

    一.面向对象实例--设计英雄这个类 LOL有很多英雄,比如盲僧,团战可以输,提莫必须死,盖伦,琴女 所有这些英雄,都有一些共同的状态 比如,他们都有名字,hp,护甲,移动速度等等 这样我们就可以设计一 ...

  3. Java基础02 面向对象

    文章目录 01 面向对象基础 1.设计对象并使用 1.1 类和对象 1.2 类的几个补充注意事项 2.封装 2.1 封装的概念 2.2 private关键字 3.this关键字 3.1 就近原则 3. ...

  4. 新手学java7编程_新手学Java 7编程:面向对象程序设计

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面向对象程序设计 Java的核心是面向对象程序设计(OOP).面向对象方法论与Java是密不可分的,而Java所有的程序至少在某种程度上都是面向对象的.因 ...

  5. java新手的通病_编程随想:Java新手的通病 PDF 下载

    编程随想:Java新手的通病 PDF 下载 下载地址: 提取码:onyi 相关截图: 主要内容: 其实很早以前就想写这样一个文章,可惜当时我没有 Blog,所以到现在才写下来.最近几年,随着 Java ...

  6. Java新手极简指北手册

    在理论上, 理论和实践是没有差异的; 但在实践中, 是有的. In theory, there is no difference between theory and practice. But in ...

  7. 课工场java新手基础教程_Java新手学习路线,学Java不走弯路

    Java新手学习路线,学Java不走弯路 很多人都会有一个疑问,就是学习Java能看懂,但是不会写,所以学习Java一定要掌握一个有效率的学习方法,一个适合自己的学习方法,作为一个新人,千万不要自己瞎 ...

  8. Java新手看招 常用开发工具介绍

    Java新手看招 常用开发工具介绍 Java的应用越来越广泛,学习Java的人也越来越多.学过程序设计的人知道,使用Basic进行程序设计,可以使用QBasic.Visual Basic等开发工具:使 ...

  9. Java泛型解析(02):通配符限定

    Java泛型解析(02):通配符限定      考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil {public static <T> ...

最新文章

  1. 使用OpenCV实现摄像头测距
  2. AttributeError: ‘Tensor‘ object has no attribute ‘encoder‘
  3. Spring使用Quartz配置调度事务
  4. 数据库中的行锁和表锁
  5. 一看就会——蓝桥杯 试题 基础练习 完美的代价——贪心法,21行代码AC
  6. Requests库实战(二)---破解百度翻译
  7. 计算机辅助设计设计师理论知识试卷,计算机辅助设计试卷 A卷
  8. IPsec ***路由配置
  9. 剑指Offer之求解1+2+....+n
  10. C#数组Array的基础知识及二位数组和数组的数组的区别
  11. Android连点器(adb)
  12. 看完这20部电影,你可以去全球任何一家公司做董事长或总经理
  13. 爱荷华州立大学计算机科学,2020年爱荷华州立大学排名TFE Times美国最佳计算机科学硕士专业排名第63...
  14. phalcon mysql_PHP-Phalcon框架中的数据库操作
  15. 坐的越久,死的越快——说说工作环境
  16. 半年损失超20亿美元,区块链安全赛道被资本疯抢
  17. execvp函数详解_如何在C / C ++中使用execvp()函数
  18. 6-2 抽象类Shape (10 分)
  19. 机器学习 深度学习 神经网络 图像处理优质博客整理
  20. php添加浮动广告,漂浮广告是什么?漂浮广告如何设置

热门文章

  1. python学到什么程度可以写爬虫-刚开始学习 Python 到可以写出一个爬虫大约需要多长时间...
  2. python读数据-如何用Python读取开放数据?
  3. python读文件操作-python 之文件操作
  4. python安装流程-Python安装与卸载流程
  5. python爬取贴吧所有帖子-Python爬虫实例(一)爬取百度贴吧帖子中的图片
  6. python语法手册-python语法手册
  7. python新手小项目-推荐:一个适合于Python新手的入门练手项目
  8. python文件可以用什么软件打开-py文件用什么可以打开.
  9. python资料书-《Python数据分析与应用》——图书配套资料下载
  10. python入门教程 pdf-Python快速入门PDF高清完整版本下载