程序大牛由浅入深,带你学习面向对象编程

前言

面向对象的Java语言具备“一次编程,任何地方均可运行”的能力,使其成为服务提供商和系统集成商用以支持多种操作系统和硬件平台的首选解决方案。Java作为软件开发的一种革命性的技术,其地位已被确定。如今,Java 技术已被列为当今世界信息技术的主流之一。

正文

面向对象开发方法概述

一般说来,软件开发都会经历以下生命周期:

●软件分析:分析问题领域,了解用户的需求。

●软件设计:确定软件的总体架构,把整个软件系统划分成大大小小的多个子系统,设计每个子系统的具体结构。

●软件编码: 用选定的编程语言来编写程序代码,实现在设计阶段勾画出的软件蓝图。

●软件测试: 测试软件是否能实现特定的功能,以及测试软件的运行性能。

● 软件部署:为用户安装软件系统,帮助用户正确地使用软件。

●软件维护:修复软件中存在的Bug,当用户需求发生变化时(增加新的功能,或者修改已有功能的实现方式),修改相应的软件。

为了提高软件开发效率,降低软件开发成本,一个优良的软件系统应该具备以下特点:

●可重用性: 减少软件中的重复代码, 避免重复编程。

●可扩展性:当软件必须增加新的功能时,能够在现有系统结构的基础上,方便地创建新的子系统,不需要改变软件系统现有的结构,也不会影响已经存在的子系统。

●可维护性:当用户需求发生变化时,只需要修改局部的子系统的少量程序代码,不会牵一发而动全身,修改软件系统中多个子系统的程序代码。

如何才能使软件系统具备以上特点呢?假如能把软件分解成多个小的子系统,每个子系统相对独立,把这些子系统像搭积木样灵活地组装起来就构成了整个软件系统,这样的软件系统便能获得以上优良特性。软件中的子系统具有以下特点:

●结构稳定性: 软件在设计阶段,在把.个系统划分成更小的子系统时,设计合理,使得系统的结构比较健壮,能够适应用户变化的需求。

●可扩展性: 当软件必须增加新的功能时,可在现有子系统的基础上创建出新的子系统,该子系统继承了原有子系统的些特性,并且还具有一些新的特性,从而提高软件的可重用性和可打展性。

●内聚性: 每个子系统只完成特定的功能,不同子系统之间不会有功能的重叠。为了避免子系统之间功能的重叠,每个子系统的粒度在保持功能光整性的前提下都尽可能小,按这种方式构成的系统结构被称为精粒度系统结构。子系统的内聚性会提高软件的可重用性和可维护性。

●可组合性: 若干精粒度的子系统经过组合,就变成了大系统。子系统的可组合性会提高软件的可重用性和可维护性,并且能够简化软件的开发过程。

●松耦合: 子系统之间通过设计良好的接口进行通信,但是尽量保持相互独立,修改一个子系统,不会影响到其他的子系统。当用户需求发生变化时,只需要修改特定子系统的实现方式,从而提高软件的可维护性。

面向对象的软件开发方法简介

面向对象的开发方法把软件系统看成是各种对象的集合,对象就是最小的子系统,一组相关的对象能够组合成更复杂的子系统。面向对象的开发方法具有以下优点:

●把软件系统看成是 各种对象的集合,这更接近人类认识世界的自然思维方式。

●软件需求的变动往往是功能的变动,而功能的执行者一对象- -般不会有大的变化。这使得按照对象设计出来的系统结构比较稳定。

●对象包括属性(数据)和行为(方法),对象把数据及方法的具体实现方式一起封装起来,这使得方法和与之相关的数据不再分离,提高了每个子系统的相对独立性,从而提高了软件的可维护性。

●支持封装、 抽象、继承和多态等各种特征,提高了软件的可重用性、可维护性和可扩展性。这些特征将在后面的章节中详述。

对象模型

在面向对象的分析和设计阶段,致力于建立模拟问题领域的对象模型。建立对象模型既包括自底向上的抽象过程。也包括自项向下的分解过程。

(1)自底向上的抽象。

建立对象模型的第一-步是从问题领域的陈述入手。分析需求的过程与对象模型的形成过程一致,开发人员与用户的交谈是从用户熟悉的问题领域中的事物(具体实例)开始的,这就使用户与开发人员之间有了共同语言,使得开发人员能彻底搞清用户需求,然后再建立正确的对象模型。开发人员需要进行以下自底向上的抽象思维:

●把问题 领域中的事物抽象为具有特定属性和行为的对象。比如一个模拟动物园的程序中,存在各种小动物对象,比如各种小猫、小狗等。

●把具有相同属性 和行为的对象抽象为类。比如尽管各种小猫、小狗等对象各自不同,但是它们具有相同的属性和行为,所以可以将各种小猫对象抽象为小猫类,而各种小狗对象抽象为小狗类。

●当多个类之间存在一 些共性(具有相同属性和行为)时,把这些共性抽象到父类中。比如在前面的例子中,小猫类和小狗类又可以进一步归于哺乳动物类。在自底向上的抽象过程中,为使子类能更合理地继承父类的属性和行为,可能需要自顶向下的修改,从而使整个类体系更加合理。由于这种类体系的构造是从具体到抽象,再从抽象到具体的,符合人类的思维规律,因此能更快、更方便地完成任务。这与自项向下的结构化开发方法构成鲜明的对照。在结构化开发方法中,构造系统模型是最困难的一步,因为自项向下的“顶" (即系统功能)是-一个空中楼阁,缺乏坚实稳定的基础,而且功能分解有相当大的任意性,因此需要开发人员有丰富的软件开发经验。而在面向对象建模中,这一工作可由- -般开发人员较快地完成。

(2)自顶向下的分解。

在建立对象模型的过程中,也包括自项向下的分解。例如对于计算机系统,首先识别出主机对象、显示器对象、键盘对象和打印机对象等。接着对这些对象再进一一步分解,例如主机对象由处理器对象、内存对象、硬盘对象和主板对象等组成。系统的进一步分解因有具体的对象为依据,所以分解过程比较明确,而且也相对容易。所以面向对象建模也具有自项向下开发方法的优点,既能有效地控制系统的复杂性,又同时避免了结构化开发方法中功能分解的困难和不确定性。

类的生命周期

Java虚拟机为Java程序提供运行时环境,其中一项重要的任务就是管理类和对象的生命周期。类的生命周期从类被加载、连接和初始化开始,到类被卸载结束,当类处于生命周期中时,它的二进制数据位于方法区内,在堆区内还会有一个相应的描述这个类的Class对象。只有当类处于生命周期中时, Java 程序才能使用它,比如,调用类的静态属性和方法,或者创建类的实例。

Java虚拟机及程序的生命周期

当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程。Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命周期。在以下情况,Java 虚拟机将结束生命周期:

●程序正常执行结束。

程序在执行中因为出现异常或错误而异常终止。

●执行了 System.cxit0)方法。

由于操作系统出现错误而导致Java虚拟机进程终止。当Java虚拟机处于生命周期中时,它的总任务就是运行Java程序,Java程序从开始运行到终止的过程称为程序的生命周期,它和Java虚拟机的生命周期是一致的。

类的加载、 连接和初始化

当Java程序需要使用某个类时,Java 虚拟机会确保这个类已经被加载、连接和初始化。其中连接过程又包括验证、准备和解析这了个子步骤。如图下图所示。从图中可以看出,这些步骤必须严格地按以下顺序执行:

(1)加载:查找并加载类的二进制数据。

(2)连接:包括验证、准备和解析类的二进制数据。

①验证:确保被加载类的正确性。

②准备:为类的静态变量分配内存,并将其初始化为默认值。

③解析:把类中的符号引用转换为直接引用。

(3)初始化:给类的静态变量赋予正确的初始值。

在类或接口被加载和连接的时机上.Java虛拟机规范给实现提供了-一定的灵活性,但是它严格定义了初始化的时机,所有的Java虚拟机实现必须在每个类或接口被Java程序“首次主动使用"时才初始化它们。Java 程序对类的使用方式可分为两种:主动使用和被动使用,本章第10.2.6节(类的初始化的时机)对此做了介绍。

程序大牛由浅入深,带你学习面向对象编程

类的加载

类的加载是指把类的.class文件中的二进制数据读入到内存中,把它存放在运行时数据区的方法区内,然后在堆区创建一个 javalang.Class对象,用来封装类在方法区内的数据结构。

Java虚拟机能够从多种来源加载类的二进制数据,包括:

●从本地文件 系统中加载类的class文件,这是最常见的加载方式。

●通过网络下载类的.class文件。

●从ZIP、JAR或其他类型的归档文件中提取.class文件。

●从一个专 有数据库中提取.class文件。

●把一个Java源文件动态编译为.class文件。

类的加载的最终产品是位于运行时数据区的堆区的Class对象,Class 对象封装了类在方法区内的数据结构,并且向Java程序提供了访问类在方法区内的数据结构的接口,如下图所示:

程序大牛由浅入深,带你学习面向对象编程

类的加载是由类加载器完成的。类加载器可分为两种:

●Java 虚拟机自带的加载器:包括启动类加载器、扩展类加载器和系统类加载

奇。

●用户自定 义的类加载器:是java.lang.Classl oader类的子类的实例,用户可以通过它来定制类的加载方式。

类加载器并不需要等到某个类被“首次主动使用”时再加载它,Java虚拟机规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载过程中遇到.class文件缺失或者存在错误,类加载器必须等到程序首次主动使用该类时才报告错误(抛出一个LinkageError实例)。如果这个类一直没 有被程序主动使用,那么类加载器将不会报告错误。

相关推荐