引论 :
对于继承可能会引发某种争论:继承应该只重载基类的方法(而并不添加在基类中没有的新方法)吗?如果这样做,就意味着导出类和基类是完全相同的类型,因为它们具有完全相同的接口。结果你可以用一个导出类对象来完全替代一个基类对象。这可以被视为“纯粹替代(pure substitution)”,通常称之为“替代法则(substitution principle)”。在某种意义上,这是一种处理继承的理想方式。我们经常将这种情况下的基类与导出类之间的关系称为“is-a”关系,因为你可以说“一个圆形就是一个几何形状”。判断是否继承,就是要确定你是否可以用is-a来描述类之间的关系,并使之具有实际意义。
有时你必须在导处类型中添加新的接口元素,这样也就扩展了接口并创建了新的类型。这个新的类型仍然可以替代基类,但是这种替代并不完美,因为基类无法访问你新添加的方法。这种情况我们可以描述为“is-like-a”关系。新类型具有旧类型的接口,但是它还包含其他方法,所以你不能说它们完全相同。以空调为例,假设你的房子里已经布线安装好了所有的冷气设备的控制器,也就是说,你的房子具备了让你控制冷气设备的接口。想象一下,如果空调坏了,你用一个既能制冷又能制热的热力泵替换了它,那么这个热力泵就“is-like-a(像是一个)”空调,但是它可以做更多的事。因为你的房子的控制系统被设计为只能控制冷气设备,所以它只能和新对象中的制冷部分进行通信。尽管新对象的接口已经被扩展了,但是现有系统除了源接口之外,对其他东西一无所知。
当然,在你看过这个设计之后,你会发现很显然,Cooling System这个基类不够一般化,应该将其更名为“温度控制系统”,使其可以包括制热功能,这样我们就可以套用替代法则了。这张图说明了在真实世界中进行设计时可能会发生的事情。
当你看到替代法则时,很容易会认为这种方式“纯粹替代”是唯一可行的方式,而且事实上言此方式,你的设计会显得很好。但是你会发现有时同样很明显你必须在导处类接口中添加新方法。只要仔细审视,两种方法的使用场合应该是相当明显的。

提问:
java 容器都有哪些?
Collection 和 Collections 有什么区别?
List、Set、Map 之间的区别是什么?
HashMap 和 Hashtable 有什么区别?
如何决定使用 HashMap 还是 TreeMap?
说一下 HashMap 的实现原理?
说一下 HashSet 的实现原理?
ArrayList 和 LinkedList 的区别是什么?
如何实现数组和 List 之间的转换?
ArrayList 和 Vector 的区别是什么?
Array 和 ArrayList 有何区别?
在 Queue 中 poll()和 remove()有什么区别?
哪些集合类是线程安全的?
迭代器 Iterator 是什么?
Iterator 怎么使用?有什么特点?
Iterator 和 ListIterator 有什么区别?
怎么确保一个集合不能被修改?

Apache Software Foundation Thinking in Java:只要仔细审视,两种方法的使用场合应该是相当明显的相关推荐

  1. java创建数组的两种方法

    java创建数组的两种方法 1,静态初始化 int[] array={1,2,3,4,5}; 2,动态初始化 1)先分配空间再给数组元素赋值 int[] array=new int[10]; //需指 ...

  2. java数组去重方法是,java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  3. Java匹配qq号两种方法(1、长度为5~10位。2、不能以0开头。3、纯数字组成)

    Java匹配qq号两种方法 package com.oneProject; import java.util.Scanner; /** 题目: 匹配qq号(1.长度为5~10位.2.不能以0开头.3. ...

  4. java创建线程的两种方法区别

    在Java中创建一个线程有两种方法:继承Thread类和实现Runnable接口. 下面通过两个例子来分析两者的区别: 1)继承Thread类 public class TestThread exte ...

  5. java创建线程的两种方法是_java创建线程的两种方法

    要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 哪种方法 ...

  6. [Java] 实现多线程的两种方法

    版权声明:请尊重个人劳动成果,转载注明出处,谢谢! Java提供了两种创建线程方法: 通过实现Runable接口: 通过继承Thread类本身. 1 .声明实现 Runnable 接口的类,该类然后实 ...

  7. java切分字符串的两种方法

    java中包含两种切分字符串方式:如下 方法一:通过substring()截取字符串 1. 只传入一个参数 substring(int beginIndex) 传一个参数,含义为将字符串从索引号为be ...

  8. Apache Software Foundation Thinking in Java:构造器调用的层次结构带来了一个有趣的两难问题

    引论 : 构造器调用的层次结构带来了一个有趣的两难问题.如果在一个构造器的内部,同时调用正在构造的那个对象的某个动态绑定方法,那会发生什么情况呢?在一般的方法内部,我们可以想象会发生什么:动态绑定的调 ...

  9. java web 读取配置文件两种方法

    package com.tsinghua.getDataBaseConn; import java.io.IOException; import java.io.InputStream; import ...

最新文章

  1. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
  2. 数据结构源码笔记(C语言):快速排序
  3. 海量数据处理专题(六)——双层桶划分
  4. java去除字符串的空格,换行符,水平制表符,回车
  5. Object类的用法(一)
  6. 英语总结系列(十五):别样的三月
  7. 所有子模块都要执行的checkstyle检查
  8. 信息学奥赛C++语言:什么时候开会
  9. 阿里巴巴2016前端开发工程师笔试一
  10. ARM裸机篇(二)——i.MX6ULL启动过程
  11. Flutter--Hero组件
  12. vue-pdf使用+分页预览(踩坑 + 使用本地字体库)
  13. ThingsBoard安装
  14. NC14745 Hungry!
  15. 马云的菜鸟网络已犯了几个关键性的重大战略错误
  16. 关于行政区划的数据表的设计
  17. 浅谈发票识别方案-开篇
  18. Pyplot 常见绘图方法
  19. 2.1 Python图像的空域增强处理-灰度映射
  20. 本科计算机科学与计算机论文答辩,本科计算机专业毕业论文答辩是怎样的

热门文章

  1. Chrome再出招 呈现API将仅支持HTTPS
  2. adb安装教程(详细)
  3. 时间序列预测:用电量预测 07 灰色预测算法
  4. 简单介绍NAS、DAS、SAN三种存储方式
  5. NVIDIA 不同显卡对应的GPU计算能力
  6. 终极单词index 排序 E-F
  7. ISO三体系认证需要什么材料,办理流程
  8. linux yum fping,ping fping
  9. SOA与BPM的融合
  10. js基础知识(十七)--数组