面向对象程序设计是目前主流的程序设计泛型,它取代了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的同时,会增加一些额外的功能。