面向对象程序与设计

面向对象程序设计是目前主流的程序设计泛型,它取代了20世纪70年代的“结构化”编程和过程化编程。

面向对象程序由对象组成。每个对象包含对用户的特定功能部分和隐藏的实现部分。

程序中很多对象来自标准库,还有一些是自定义的。从根本上来说,只要对象能满足需求,就不用关心它是怎么来的。

程序侧重点的不同

传统的结构化程序设计通过设计一系列的过程(即算法)来求解问题。

即算法是第一位的,数据结构是第二位的,程序员首先要决定如何操作数据,之后再决定如何组织数据。

而面向对象程序设计是以数据结构的构成作为核心。

程序员要先组织数据,之后再决定如何操作数据。

面向对象更加适合解决规模较大的问题。

面向对象的最底层也是面向过程,只不过它对过程进行了抽象

类的概述

类是构造对象的模板或蓝图

由类构造对象的过程称为创建类的实例。

Java标准库

标准Java库中提供了几千个类,可以用于各种目的。尽管如此,在Java中还是需要自己创建一些类,一边描述你的应用程序所对应的问题领域中的对象。

封装概念

封装(有时候成为数据隐藏)是处理对象的一个重要概念。

从形式上看,封装就是将数据和行为组织在一个包里,并对对象的使用者隐藏具体的实现方式。

实例字段与方法

对象中的数据称为实例字段,操作数据的过程成为方法,特定对象都有一组特定的实例字段值。这些值的集合就是这个对象的当前状态。

无论何时,只要再对象上调用方法,它的状态就可能改变

封装实现的关键

实现封装的关键在于,绝对不能让类中的方法直接访问其他类的实例字段。

程序只能通过对象的方法与对象数据进行交互。

封装给予了对象“黑盒”的特征。这是提高重用性和可靠性的关键

意味着:一个类可以完全概念存储数据的方式,只要仍然使用同样的方法操作数据,其对象就不会知道也不用关心这个类所发生的变化

继承概念

Java中可以通过扩展其他类,来构建新的类。

事实上Java中所有的类都扩展自Object类。

这个被扩展后的新类,具有被扩展的类的全部属性和方法。

只要在新类中提供适合这个新类的方法和字段就可以了。

这种通过扩展=来建立另一个类的方式,被称为继承

对象

对象的三个主要特性

  • 对象的行为——可以对对象完成哪些操作,或者可以对对象应用哪些方法。

  • 对象的状态——当掉用那些方法时,对象会如何响应?

  • 对象的标识——如何区分具有相同行为与状态的不同对象?

对象的基本概念

同一个类的所有对象实例,由于支持相同的行为而具有家族式的相似性。对象的行为是用可调用的方法来定义的。

每个对象都保存着描述当前状况的信息。这就是对象的状态。

对象状态的改变,必须通过调用方法实现。

对象的状态并不能完全描述一个对象,每个对象都有一个唯一的标识id

作为同一个类的实例,每个对象的标识总是不同的,状态往往也存在着差异。

对象的这些关键特性会彼此相互影响。

识别类

传统的函数式编程中,总是从main方法开始,而OOP则应该从识别类开始,之后再对类添加各种方法。

面向对象编程的开始

识别类的一个简单经验是在分析问题的过程中寻找名词,而方法对应着动词。

当然,这种“名词与动词”原则只是一种经验,在创建类的时候,只有经验才能帮助你确定哪些名词和动词重要。

类之间的关系

类之间最常见的关系有:

  • 依赖

  • 集合

  • 继承

依赖

依赖,即uses-a关系,是一种最明显的、最常见的额关系。

如果一个类,使用另一个类的方法,或操作另一个类的对象,我们就说你,这个类依赖于另一个类。

应该尽可能地将相互依赖的类减至最少。

关键是,如果类A不知道B的存在,它就不会关系B怎么改变。

用软件工程的数据来说,就是要降低耦合度

聚合

聚合,即has-a关系,很容易理解。

如果一个类对象中包含着另一个类的对象,我们就说他们聚合在一些。

例如:公司类对象包含着一些员工类对象一样

继承

继承,即is-a关系,表示一个更特殊的类与一个更一般的类之间的关系。

如果类A扩展类B,那我们就说,类A继承类B。

一般而言,类A在继承类B的同时,会增加一些额外的功能。