Code & Fun

《 Java 编程思想》CH01 对象的概念

@(后端开发)[Java, 阅读笔记]

[TOC]

抽象过程

所有编程语言都提供抽象机制,人们所能解决的问题的复杂性直接取决于抽象的类型和质量。

OOP 允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。

纯粹的面向对象程序设计方法:

  • 万物皆对象
  • 程序是对象的集合
  • 每个对象都有自己的由其他对象所构成的存储
  • 每个对象都拥有类型
  • 某一个特定类型的所有对象都可以接收同样的信息

对象具有状态、行为和标识

每个对象都有一个接口

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

类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型

面向对象程序设计的挑战之一,就是在问题空间的元素和解空间的对象之间创建一对一的映射。

每个对象都只能满足某些请求,这些请求由对象的接口(interface)所定义,决定接口的便是类型。

接口确定了某一个特定对象所能发出的请求,但是,在程序中必须有满足这些请求的代码,这些代码与隐藏的数据一起构成了实现(implement)

每个对象都提供服务

当正在试图开发或理解一个程序设计,最好的方法之一就是将对象想象成“服务提供者”

高内聚是软件设计的基本质量要求之一:这意味着一个软件构件的各个方面“组合的好”

被隐藏的具体实现

将程序开发人员按照角色分为类创建者客户端程序员

  • 客户端程序员的目标是收集各种用来实现快速应用开发的类。
  • 类创建者的目标是构建类,这种类只向客户端程序员暴露必需的部分,而隐藏其他部分。

将实现隐藏起来可以减少程序的 bug,即访问控制,访问控制存在的原因:

  1. 让客户端程序员无法触及他们不应该触及的部分。
  2. 允许库设计者可以改变类内部的工作方式而不担心会影响到客户端程序员。

Java 中的四种访问权限:

  • public:任何人都是可用的
  • private:除了类型创建者和类型的内部方法之外任何人都不能访问
  • protected:与 private 类似,差别在与继承于该类的派生类可以访问protected 成员
  • default:包访问权限,同一个包中其他类可以访问。

复用具体实现

代码复用是面向对象程序设计语言所提供的最了不起的优点之一

组合(“has-a”关系):新的类可以由任意数量、类型的其他对象以任意可以实现新的类中想要的功能的方式组成。如果组合是动态发生的,那么它通常被称为“聚合”

*在建立新类时,应该首先考虑组合,而不是继承,因为它更加简单灵活。

继承

两个类型可以有相同的特性和行为,但是其中一个类型可能比另一个含有更多的特性。继承使用基类型和派生类型的概念表示了这种类型之间的相似性。

一个基类型包含所有派生类所共享的特性和行为,可以创建一个基类型来表示系统中某些对象的核心概念,从基类型中派生出其他类型,来表示该核心可以被不同的方式实现。

通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。

基类与派生类的相似性:所有可以发送给基类对象的消息同时也可以发送给派生类对象。
产生基类与派生类的差异性的两种形式:

  1. 在派生类添加新方法
  2. 在派生类中改变现有基类的方法,即覆盖

“是一个”与“像是一个”

  • “是一个”(is-a):只是覆盖,没有添加新的方法。
  • “像是一个”(is-like-a):添加了新的方法。

伴随多态的可互换对象

在处理类型的层次结构时,把一个对象不当做它所属的特性类型来对待,而是将其当做其基类的对象来对待,这一可以编写出不依赖于特定类型的代码。

为了实现泛型,面向对象程序设计语言使用了后期绑定的概念,当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。

Java 使用了一小段特殊的代码来代替绝对地址调用。

在某些语言中(如C++),必须明确声明希望某个方法具备后期绑定,而 Java 中,动态绑定是默认行为,不需要额外添加关键字来实现多态。

单根继承结构

所有的类都最终继承自单一的基类,Java 中 这个类为 Object

在单根继承结构中的所有对象都具有一个公用接口,所以它们归根到底都是相同的基本类型。

单根继承结构使得垃圾回收的实现变得容易得多。

容器

  • 不同容器提供了不同类型的接口和外部行为
  • 不同容器对于某些操作具有不同的效率

参数化类型

容器是通过向下转型实现的,容器知道元素转型前的类型,则可以实现容器,这种解决方法即参数化类型,即泛型

对象的创建和生命期

  • Java 完全采用动态内存分配方式,每当想要创建新对象时,就要使用 new 关键字来构建此对象的动态实例。
  • Java 提供了“垃圾回收”机制,它可以自动发现对象何时不再被使用,进而销毁它。

异常处理

大多数错误机制的主要问题在于,它们都依赖于程序员自身的警惕性,这种警惕性来源于一种共同的约定,而不是编程语言所强制的。这种机制容易被忽视。

被抛出的异常不像方法返回的错误值和方法设置的用来表示错误条件的标志位那样可以被忽略。异常不能被忽视,所以它保证一定会在某处得到处理

异常处理不是面向对象的特性。


本文首发于Code & Fun