结构化程序设计中的任何结构都具有唯一的入口和唯一的出口,并且程序不会出现死循环。在程序的静态形式与动态执行流程之间具有良好的对应关系。Java 语言的方法体内同样是由顺序结构、循环结构、选择结构这三种程序结构组成的,Java 的方法里是一种结构化的程序流。

面向对象是使用类、对象、继承、封装、消息等基本概念进行程序设计。它从现实世界中客观存在的事物(即对象〉出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以现实世界中的事物(即对象)为中心来思考,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的类,作为系统的基本构成单元(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的过程来构造系统) ,这使得软件系统的组件可
以直接映像到客观世界,并保持客观世界中事物及其相互关系的本来面貌。

采用面向对象方式开发的软件系统,其最小的程序单元是类,这些类可以生成系统中的多个对象,而这些对象则直接映像成客观世界的各种事物。

面向对象的软件系统由多个类组成,类代表了客观世界中具有某种特征的一类事物,这类事物往往有一些内部的状态数据,比如人有身高、体重、年龄、爱好等各种状态数据当然程序没必要记录该事物所有的状态数据,程序只要记录业务关心的状态数据即可。
面向对象的语言不仅使用类来封装一类事物的内部状态数据,这种状态数据就对应成员变量(由Field 翻译而来,有些资料将其直译为宇段;还有些资料将其翻译为属性,但这个说法非常不准确, Java 的属性指的是Property); 而且类会提供操作这些状态数据的方法,还会为这类事物的行为特征提供相应的实现,这种实现也是方法。

成员变量(状态数据) +方法(行为) =类定义

面向对象比面向过程的编程粒度要大: 面向对象的程序单位是类;而面向过程的程序单位是函数(相当于方法) , 因此面向对象比面向过程更简单、易用。

假设需要组装一台电脑,如果拿到手的是主板、CPU、内存条、硬盘等这种大粒度的;‘画, 纽件,随便找个人就可以把它们组装成一台电脑;但如果拿到手的是一些二极管、二极管、集成电路等小粒度的组件,要想把它们组装成电脑,恐怕没那么容易。如果把数据以及操作数据的方法都封装成对象,这就相当于提供了大粒度的组件,因此编程更容易。

从面向对象的眼光来看,开发者希望从自然的认识、使用角度来定义和使用类。也就是说,开发者希望直接对客观世界进行模拟:

定义一个类,对应客观世界的哪种事物;

业务需要关心这个事物的哪些状态,程序就为这些状态定义成员变量:

业务需要关心这个事物的哪些行为,程序就为这些行为定义方法。

不仅如此,面向对象程序设计与人类习惯的思维方法有较好的一致性,比如希望完成"猪八戒吃西瓜"这样一件事情。
在面向过程的程序世界里,一切以函数为中心,函数最大,因此这件事情会用如下语句来表达:吃(猪八戒,西瓜) ;
在面向对象的程序世界里, 一切以对象为中心,对象最大,因此这件事情会用如下语句来表达:猪八成. 吃(西瓜) ;
对比两条语句不难发现,面向对象的语句更接近自然语言的语法:主语、谓语、宾语一目了然,十分直观,因此程序员更易理解。

抽象也是面向对象的重要部分, 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象不打算了解全部问题,而只是考虑部分问题。例如,需要考察Person 对象时,不可能在程序中把Person 的所有细节都定义出来,通常只能定义Person的部分数据、部分行为特征一一而这些数据、行为特征是软件系统所关心的部分。

虽然抽象是面向对象的重要部分,但它不是面向对象的特征之一,因为所有的编程语言都需要抽象。当开发者进行抽象时应该考虑哪些特征是软件系统所需要的,那么这些特征就应该使用程序记录并表现出来。因此,需要抽象哪些特征没有必然的规定,而是取决于软件系统的功能需求。

面向对象还支持如下几个功能。
对象是面向对象方法中最基本的概念,它的基本特点有: 标识唯一性、分类性、多态性、封装性、模块独立性好。
类是具有共同属性、共同方法的一类事物。类是对象的抽象;对象则是类的实例。而类是整个软件系统最小的程序单元,类的封装性将各种信息细节隐藏起来,并通过公用方法来暴露该类对外所提供的功能,从而提高了类的内聚性,降低了对象之间的稿合性。
对象间的这种相互合作需要一个机制协助进行,这样的机制称为"消息"。消息是一个实例与另一个实例之间相互通信的机制。(不理解????)
在面向对象方法中,类之间共享属性和操作的机制称为继承。继承具有传递性。继承可分为单继承( 一个继承只允许有一个直接父类,即类等级为树形结构)与多继承( 一个类允许有多个直接父类) 。

在编程语言领域,还有一个"基于对象"的概念, 这两个概念极易混淆。

通常而言,"基于对象"也使用了对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象, 也就是说,"基于对象"没有继承的特点:而"多态"则更需要继承,没有了继承的概念也就无从谈论"多态"。

面向对象方法的三大基本特征(封装、继承、多态〉缺一不可。

例如, JavaScript 语言就是基于对象的,它使用一些封装好的对象,调用对象的方法,设置对象的属性:但是它们无法让开发者派生新的类,开发者只能使用现有对象的方法和属性。(js不也是面向对象的吗?)

判断一门语言是否是面向对象的,通常可以使用继承和多态来加以判断。"面向对象"和"基于对象"都实现了"封装"的概念,但是面向对象实现了"继承和多态",而"基于对象"没有实现这些。