On Java 8阅读笔记

写在前面的话

第一章对象的概念

抽象

  • 所有编程语言都提供抽象机制,问题的复杂度取决于抽象的类型和质量。
  • 面向对象程序设计方法的基本特征:
    • 1.万物皆对象
    • 2.程序是一组对象,通过消息传递来告知彼此该做什么。要请求调用一个对象的方法,你需要向该对象发送消息。
    • 3.每个对象都有自己的存储空间,可容纳其它对象。或者说,通过封装现有对象,可制作出新型对象。所以尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
    • 4.每个对象都有一种类型。根据语法,每个对象都是某个"类"的一个"实例"。其中,“类”(Class)是"类型"(Type)的同义词。一个类最重要的特征就是"能将什么消息发给它?"。
    • 5.同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为"圆"(Circle)的一个对象也属于类型为"形状"(Shape)的一个对象,所以一个圆完全能接收发送给"形状"的消息。这意味着可让程序代码统一指挥"形状",令其自动控制所有符合"形状"描述的对象,其中自然包括"圆"。这一特性称为对象的"可替换性",是OOP最重要的概念之一。

对象的简洁描述:一个对象具有自己的状态、行为和标识。这意味着对象有自己的内部数据(提供状态)、方法(产生行为),并彼此区分(每个对象在内存中都有唯一的地址)。

接口

所有对象都是唯一的,但同时也是具有相同的特性和行为的对象所归属的类的一部分。

  • 当你看到"type"这个词的时候,请同时想到class;反之亦然。

创建好一个类后,可根据情况生成许多对象。随后,可将那些对象作为要解决问题中存在的元素进行处理。事实上,当我们进行面向对象的程序设计时,面临的最大一项挑战是:如何在"问题空间"(问题实际存在的地方)的元素与"方案空间"(对实际问题进行建模的地方,如计算机)的元素之间建立理想的"一对一"的映射关系。

那么如何利用对象完成真正有用的工作呢?必须有一种办法能向发出请求,令其解决一些实际的问题,比如完成一次交易、在屏幕上画一些东西或者打开一个开关等等。每个对象仅能接受特定的请求。我们向对象发出的请求是通过它的"接口"(Interface)定义的,对象的"类型"或"类"则规定了它的接口形式。"类型"与"接口"的对应关系是面向对象程序设计的基础。

下面让我们以电灯泡为例:

On Java 8阅读笔记

上图遵循UML(统一建模语言)的格式。每个类由一个框表示,框的顶部有类型名称,框中间部分是要描述的任何数据成员、方法(属于此对象的方法,它们接收任何发送到该对象的消息)在框的底部。通常,只有类的名称和公共方法在UML设计图中显示,因此中间部分未显示,如本例,如果你只对类感兴趣,则也不需要显示方法信息。

服务提供

封装

研发程序员开发一个工具类,该工具类仅向应用程序员公开必要的内容,并隐藏内部实现的细节。这样可以有效地避免该工具类被错误的使用和更改。只有设定访问控制,才能从根本上阻止这种情况的发生。

因此,使用访问控制的原因有以下两点:

  • 1.让应用程序不要触摸他们不应该触摸的部分。(请注意,这也是一个哲学决策。部分编程语言认为如果程序员有需要,则应该让他们访问细节部分;)
  • 2.使类库创建者(研发程序员)在不影响后者使用的情况下完善更新工具库。例如,我们开发了一个功能简单的工具类,后来发现可以通过优化代码来提高执行速度。

Java有三个显式关键字来设置类中的访问权限:public(公开)、private(私有)、protected(受保护)。这些访问修饰符决定了谁能使用它们修饰的方法、变量或者类。

1.public(公开)表示任何人都可以访问和使用该元素;
2.private(私有)除了类本身和类内部的方法,外界无法直接访问该元素。private是类和调用者之间的屏障。任何试图访问私有成员的行为都会报编译时错误。
3.protected(受保护)类似于private,区别是子类(下一节就会引入继承的概念)可以访问protected的成员,但是不能访问private成员;
4.default(默认)如果你不使用前面的三者,默认就是default访问权限。default被称为包访问,因为该权限下的资源可以被同一包(库组件)中其他类的成员访问。