一、理解面向对象
JAVA
语言是纯粹的面向对象程序设计语言,这主要表现为 JAVA
完全支持面向对象的三种基本特征:封装、继承、多态
。JAVA
语言完全以对象为中心,JAVA
程序的最小程序单元是类,整个 JAVA
程序由一个一个的类组成。
面向对象的方式实际上由 OOA
(面向对象分析)、OOD
(面向对象设计)、OOP
(面向对象编程)三个部分组成的,OOA
对目标系统进行分析并建立分析模型,并将之文档化。OOD
用面向对象的思想将 OOA
的结构进行细化,得出设计模型。OOA
和 OOD
的分析、设计结果需要统一的符号的描述、交流和记录,其中 UML
(统一建模语言)用来描述和记录 OOA
和 OOD
的结果。
在目前的软件开发领域有两种主流的开发方法:结构化开发方法(C
、Basic
等)和面向对象开发方法(C#
、JAVA
等)。
结构化程序设计
结构化程序设计方式主张按功能来分析系统需求,其主要原则可概括为自顶向下,逐步求精,模块化等。结构化程序设计首先采用结构化分析(Structrued Analysis
-- SA
)方法对系统进行需求分析,然后使用结构化设计(Structrued Desigen
-- SD
)方法对系统进行概要设计,最后采用结构化编程(Structrued Programming
-- SP
)方法来实现系统。
结构化程序设计里最小的程序单元是函数,每个函数都负责完成一个功能,用以接受一些输入数据,函数对这些输入数据进行处理,处理结束后输出一些数据。整个软件系统由一个一个函数组成,其中作为程序入口的函数被称为主函数,主函数调用其他函数,完成整个软件系统的功能。
结构化程序设计方式的局限性
-
设计不够直观,与人类习惯思维不一致,采用结构化程序分析、设计时,开发者需要将客观世界模型分解成一个一个的功能,每个功能用以完成一定的数据处理。
-
适应性差,可扩展差。由于结构化程序设计采用自上而下的设计方式,所以当用户需求发生改变或者需要修改现有的实现方式时,都需要自上而下的修改模块结构,这种方式的维护成本相当大。
程序的三种基本结构
结构化程序设计的概念首先是从过去编程过程中无限制的使用 GOTO
语句而提出来的。GOTO
语句可以使程序的控制流程强制性的转向程序的任意处,如果允许程序设计中随意使用 GOTO
语句,将会导致程序流程无序可寻,程序结构杂乱无章,所以不提倡使用。
Java
语言也拒绝使用 GOTO
语句,但它将 GOTO
作为保留字,意思是目前的 Java
版本还未使用 GOTO
语句,但是也许未来的日子里,如果不得不使用 GOTO
语句时,Java
还是可能使用 GOTO
语句的。
任何简单或复杂的算法都可以使用以下三种结构:
-
顺序结构
事实上,不论程序中包含了什么样的结构,而程序的总流程都是顺序结构的,对于
Java
而言,其方法类似于结构化程序设计的函数,方法里的总流程也是顺序结构的。 -
选择结构
单选结构和双选结构
多选结构
-
循环结构
Java
是面向对象的,但是 Java
的方法里则是一中结构化的程序流。
面向对象程序设计
面向对象是一种更优秀的程序设计方法,它的基本思想是使用类、对象、封装、继承、多态、消息等基本概念来进行程序设计。它是从现实世界中客观存在的事物(对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式。强调直接以现实世界中的事物(对象)为中心来思考问题、认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的类,作为系统的基本构造单元,这使得系统可以直接映射客观世界,并保持客观世界中事物及其相互关系的本来面貌。
如果采用面向对象方式开发软件系统,其最小的程序单元是类,这些类可以生成系统中的多个对象,而这些对象则直接映射成客观世界的各种事物。
从程序设计的角度来看,面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几个类:
-
系统中一切皆为对象
-
对象是属性及其操作的封装体
-
对象可按其性质划分为类,对象成为类的实例
-
实例关系和继承关系是对象之间的静态关系
-
消息传递是对象之间的动态联系的唯一形式,也是计算的唯一形式
-
方法是消息的序列
面向对象的基本特征
-
封装(
Encapsulation
):指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能
-
继承(
Inheritance
):继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法
-
多态(
Polymorphism
):指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在运行时可能表现出不同的行为特征
除此之外,抽象也是面向对象的重要部分,抽象就是忽略一个主体中与当前目标无关的那些方面,以便充分地注意与当前目标有关的方面。抽象不打算了解全部问题,而只是考虑部分问题,例如:我们需要考察 person
实体时,我们不可能在程序中将 person
这个类的所有细节都定义出来,通常只能定义 person
的部分数据,部分行为特征,而这些数据和行为特征是软件系统所关心的部分。
虽然抽象是面向对象中的重要部分,但是它不是面向对象的特种之一,因为所有的编程语言都需要抽象,当开发者进行抽象时,应该考虑哪些特征是软件系统所需要的,那么这些特征就应该使用程序记录并表现出来。因此,需要抽象哪些特征没有必然的规定,而是取决于软件系统的功能需求。
面向对象支持如下几个功能
-
对象是面向对象编程中最基本的概念
它的基本特点有:标识唯一性、分类性、多态性、封装性、模块独立性好
-
类是具有共同属性、共同方法的对象的集合
类是对象的抽象,对象则是类的实例。而类是整个软件系统中最小的程序单元,类的封装性将各种信息细节隐藏起来,通过公用方法暴露该类对外所提供的功能,从而提高了类的内聚性,降低了对象之间的耦合性
-
对象之间的这种相互合作需要一个机制协助进行,这样的机制称为 “消息”
消息是一个实例与另一个实例之间传递的信息
-
在面向对象方法中,类之间共享属性和操作的机制称为继承,已有的类可当做基类来引用,则新类相应的可当做派生类来引用
继承具有传递性,可分为单继承(一个继承只允许有一个直接父类,即类等级为树形结构)与多继承(一个类允许有多个直接父类)。
P.S
由于多继承可能引起继承结构的混乱,而且会大大降低程序的可理解性,所以JAVA
不支持多继承。
二、JAVA 的面向对象
JAVA 面向对象的特征
Java
是纯粹的面向对象的编程语言,完全支持面向对象的三大基本特征:封装、继承、多态。Java
程序组成单位就是类,不管多大的 java
应用程序,都是由一个一个的类组成的。
一切皆对象
在 java
语言中,除了 8 个基本的数据类型值之外,一切都是对象。而对象就是面向对象程序设计的中心。对象是人们要进行研究的任何事物,从简单的整数到复杂的飞机等均可看做对象,它不仅能表现具体的事物,还能表现抽象的规则、计划或事件。
对象具有状态,一个对象用数据值来描述他的状态,java
通过为对象定义 Field
(以前常被称为属性,现在也称为字段)来描述对象的状态。对象还有操作,这些操作可以改变对象的状态,对象的操作也被成为对象的行为,java
通过为对象定义方法来描述对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。
对象是 java
程序里的核心,所以 java
里的对象具有唯一性,每个对象都有一个标识符来引用它,如果某个对象失去了标识,这个对象将变成垃圾,只能等着系统垃圾回收机制回收它。Java
语言不允许直接访问对象,而是通过对对象的引用来操作对象。
类和对象
具有相同或类似性质的一组对象就是类,类是对一类事物的描述,是抽象的、概念上的定义。对象是实际存在的该类事物的每个个体,因而也称实例(instance
)。
对象的抽象是类,类的具体化就是对象。也可以说类的实例是对象。类是用来描述一系列对象,类概述每个对象应包括的数据和行为特征,因此我们可以把类理解成某种概念、定义,它规定了某类对象所共同具有的数据和行为特征。
Java
语言使用 class
关键字定义类,java
允许开发者自由定义类,定义类时可以使用 Field
类描述该类对象的数据,也可以使用方法来描述该类对象的行为特征。
类与类之间的关系
在客观世界中有若干类,这些类之间有一定的结构关系。通常有如下两种主要的结构关系:
-
一般 → 特殊结构:
也被称为分类结构,这种分类结构关系就是典型的继承关系,
java
语言使用extends
关键字来表示这种分类结构,java
的子类是一种特殊的父类,因此这种一般到特殊的结构关系其实是一种is a
的关系,java
只支持单继承。 -
整体 → 部分结构:
也被称为组装结构,这种分类关系就是典型的组合关系,
java
语言通过在一个类里保存另一个对象的引用来实现这种组合关系,因此这种整体到部分的结构关系其实是一种has a
的关系。
三、统一建模语言
UML
是一种定义良好、易于表达、功能强大且普通适用的建模语言。它的作用域不限于支持面向对象的分析与设计,还支持需求分析开始的软件开发的全过程。常用的 UML
图包括:用例图、类图、组件图、部署图、顺序图、活动图和状态图等。