软件的开发流程
软件的开发过程就是软件的生命周期。
(1)软件的生命周期:
- 问题定义
- 可行性分析
- 总体描述
- 系统设计
- 编码实现
- 调试和测试
- 验收与运行
- 升级与维护
- 报废阶段
(2)每个阶段的任务:
- 问题的定义及规划: 此阶段是软件开发方与需求方共同讨论,主要确定软件的开发目标及其可行性。
- 需求分析: 在确定软件开发可行的情况下,对软件需要实现的各功能进行详细分析。需求分析阶段是一个很重要的阶段,这一阶段做得好,将为整个软件开发项目的成功打下良好的基础。
- 软件设计: 此阶段主要根据需求分析的结果,把整个软件系统划分为大大小小的多个模块,设计出每一个模块的具体结构。如系统框架设计,数据库设计等。软件设计一般分为总体设计和详细设计。
- 程序编码: 此阶段是将软件设计的结果转换成计算机可运行的程序代码。在程序编码中必须要制定统一,符合标准的编写规范。以保证程序的可读性,易维护性,提高程序的运行效率。
- 软件测试: 在软件设计完成后要经过严密的测试,以发现软件在整个设计过程中存在的问题并加以纠正。整个测试过程分单元测试(白盒)、集成测试(黑盒,功能测试、强度性能测试)以及系统测试三个阶段进行。测试的方法主要有白盒测试和黑盒测试两种。在测试过程中需要建立详细的测试计划并严格按照测试计划进行测试,以减少测试的随意性。
- 运行维护: 安装部署软件系统,修复软件中存在的bug和升级系统。在软件开发完成并投入使后,由于多方面的原因,软件不能继续适应用户的要求。要延续软件的使用寿命,就必须对软件进行维护。软件的维护包括纠错性维护和改进性维护两个方面。
面向对象
无论是面向对象还是面向过程,它们都是一种编程思想。
- 编程思想:就是将你现实中的逻辑思维转换成为计算机可以理解的逻辑思维。
- 面向过程和面向对象都是早期就已经提供的一种成熟的编程思维。
1. 面向过程
(1)说明:面向过程强调的是过程,即必须清楚每一个步骤,然后按照步骤一步一步去实现。
- 面向过程中的最小程序单元:方法(函数),每一个方法负责一个功能的实现(接收数据、处理数据和展示数据),最终只要按照一定顺序调用就可以完成实现的逻辑思维。
(2)面向过程的缺陷:
- 面向过程开发是将软件系统细分为一个一个的函数组成,其中main函数作为程序主函数入口,所有的函数都要在main中执行,用以完成软件程序。这样的过程就是面向过程,这样软件系统会面临着适应性差,可扩展性和可维护性低等问题。
- 原因:随着软件系统不断扩大,需要创建很多的函数并加以管理,函数与函数之间会互相嵌套调用,此时如果需要对某个代码进行修改,就需要所有使用到这段代码的函数进行修改,扩展性和维护性很低。
2. 面向对象
因为面向过程存在着一些软件设计与开发的缺陷,所以提供了一种新的编程思想——面向对象编程思想。
(1)说明:面向对象的编程思想是在面向过程的基础之上提出的,面向对象包含面向过程。面向对象强调的是对象,通过调用对象的行为来实现功能,而不是自己一步一步的去操作。
- 面向对象是一种基于对象为主,强调对象具备哪些行为和特征的编程思想。面向对象一切皆以对象为思考点来进行问题思考,把具备这些行为和特点的对象具象化(描述出来),使用对象来完成事务的逻辑。
(2)面向对象包含面向过程:在面向对象过程中,对象具备的具体功能在代码中描述出来,使用的就是方法,对象在触发功能完成逻辑的时候,也是遵守顺序执行。
(3)优点:面向对象更加符合我们常规的思维方式,写出的程序稳定性好,可重用性强,易于开发大型软件项目,有良好的维护性。在软件工程上可以使用面向对象对项目更加合理的进行模块化开发。
3. 类与对象
3.1 类
(1)说明:类是用来描述一类具有共同属性和行为的事物的统称,类在客观现实世界是不存在的,是我们抽象出来描述信息的,并且提供属性和行为让具体的个体(对象)可以具备操作事物的能力。
- 类是对对象的描述(通过类将现实生活中的对象描述进代码中(对象的属性和行为))。
(2)类的组成:
- 属性:就是该事物的状态信息。
- 行为:就是该事物能够做什么。
3.2 对象
(1)说明:对象其实就是类的具体实例化,通过描述类创建出一个可以使用的对象。这个对象是具体存在的,并且具备该事物的属性和行为。
- 对象具备的属性和行为都是类中所提供的。
3.3 类与对象之间的关系
(1)说明:类与对象之间是一种描述与具体实现的关系,用来描述客观现实世界中对象个体(属性和行为),然后在类中创建出这个个体(对象),通过这个对象调用类中所描述的属性和行为来完成我们所需要使用的逻辑(这整个过程就是面向对象)。
- 类是一类具有共同属性和行为事物的统称,是抽象的。
- 对象是一类事务的具体实现,。
- 即:类是对象的抽象(描述),对象是类的实例化(具体创建)。
4. 创建类和对象
4.1 类的创建
(1)说明:从类的概念中可以了解到,类是由属性和方法组成的。
- 属性:定义该类事务的状态信息,在类中通过成员变量来体现(在类的方法外定义的变量,并且不使用static进行修饰)。
- 行为:定义该类事务具有什么功能,在类中通过成员方法来体现(方法定义与之前学习的方法形同,不过不使用static进行修饰)。
- 在类中描述对象属性和行为时统称为成员XXX,类中描述的成员都是属于对象。
(2)类的定义
public class 类名{ //定义了一个类
//类里面 提供对对象描述(属性和行为)
//定义成员变量(可以有多个,根据对象的属性个数决定)
访问权限修饰符 数据类型 变量名 ;
//定义成员方法(可以有多个,根据对象的行为个数决定)
访问权限修饰符 返回值类型 方法名(参数列表){
成员方法实现的方法体;
return;
}
}
- 成员变量允许使用权限修饰符进行修饰,目前可以使用的权限修饰符有两个:
- public:公有的,外接对象可以直接访问当前成员变量。
- default/package:默认的/包权限,外接对象可以直接访问当前成员变量。
- 在定义成员变量的时候,不写修饰符则权限为默认的。
- 数据类型可以是基本数据类型也可以是引用数据类型。
- 成员变量一般不会直接进行初始化,因为每个对象的属性都是不同的,所以这个属性都是根据具体的对象来决定具体的值。成员变量存在默认值,默认值由数据类型决定。
- 成员方法和之前学习的方法一样,遵守之前所有的规则,区别在于不使用static修饰。
4.2 对象的创建
(1)语法:
类名 对象名 = new 类名();
(2)说明:
- 类必须是在代码中定义过的。
- 对象名尽量有意义(见名知意),遵守标识符命名规则。
- 创建对象的时候使用到了new关键字,证明这个对象是一个引用类型变量,对象空间开辟在堆中。
- 对象的数据类型就是创建对象的类。
4.3 外接创建的对象访问成员变量和成员方法
只要是访问成员变量或成员方法,则必须提供对象。
(1)格式:
- 获取成员变量值:
对象名.成员变量;
- 给成员变量赋值:
对象名.成员变量 = 值;
- 调用成员方法:
对象名.成员方法名(对应参数);
4.4 单个对象在内存中的存储
4.5 多个对象在内存中的存储
(1)说明:一个类允许创建多个对象,但是对象与对象之间的成员变量是不共享的,每个对象的成员变量都是独立的,原因在于每床架一个对象都会在堆中开辟一个空间,这个空间中的成员变量都是对象自身的,但是每个对象所使用的成员方法是一样的。
- 只要使用了new关键字创建对象,就会在堆中开辟空间,根据不同空间划分,成员变量会在不同空间内,所以使用new所创建的对象,成员变量是不共享的(对象与对象之间独立)。
- 只要调用方法,就会在栈区中开辟一段空间,用来运行方法,在方法执行完毕后,会进行弹栈操作用以销毁栈中方法所开辟出的空间。
- 成员变量存储在堆中,成员方法存储在方法区中。
- 如果创建两个对象,其中一个对象使用new关键字进行创建,另外一个对象使用new创建好的对象进行赋值,此时两个对象指向的是堆中同一个地址,在这种情况下,属性是共享的,即一个对象的属性会直接影响另一个队形属性(就是方法中所讲的地址传递)。
4.6 匿名对象
(1)说明;匿名对象没有对象接收,只会在堆中开辟空间,不会在栈中开辟空间。
(2)语法:
new 类名();
- 这样创建的对象就叫做匿名对象,匿名对象只能使用一次,不能重复使用,多用于简单调用属性或方法。
5. 成员变量与局部变量
Java中所定义的全局变量就是成员变量,静态全局变量就是静态变量。
(1)成员变量与局部变量的区别:
- 定义的位置不同:
- 成员变量定义在方法体的外部类的内部。
- 局部变量定义在方法体的内部。
- 在内存中的存储空间不同:
- 成员变量存储在堆中。
- 局部变量存储在栈中。
- 使用的修饰符不同:
- 成员变量可以使用权限修饰符和static修饰符。
- 局部变量只能使用final关键字,剩余修饰符都不可以使用。
- 生命周期不同:
- 成员变量是随着对象的存在而存在,随着对象的消失而消失。
- 局部变量是随着方法的存在而存在,随着方法的消失而消失。
- 初始值不同:
- 成员变量会根据定义的数据类型来决定成员变量的默认初始值。
- 局部变量需要进行手动初始化后才能确定初始值是什么。
6. 构造方法
(1)说明:构造方法使用个特殊的方法,主要用于完成对象创建和对象属性的初始化操作。
-
Java提供这个方法的目的是为了方便程序员在创建对象时可以对对象的属性进行初始化赋值。因为每个属性值都是不一样的,所以提供这个方法不仅可以让每个对象进行不同属性的赋值,还方便程序员在创建对象时就将值赋给属性,而不是通过
对象.属性
的方式逐一进行赋值。 -
在创建类的时候,如果没有就定义构造方法,系统会默认提供一个无参的构造方法个类使用。如果在创建类的时候明确提供了构造方法,系统将不会提供无参构造风阀,也无法进行调用。
-
构造方法本身也是一个方法,所以满足方法重载的要求,允许类中定义构造方法的重载。
6.1 构造方法的格式
在实际开发中一个类一般会提供两个构造器,一个是无参构造器,一个是有参构造器(全属性参数)。
(1)语法:
- 无参构造器方法定义
public 类名(){
}
- 有参构造器方法定义
public 类名(类中定义了那些属性,这个参数就定义什么){
通过定义参数对类中属性进行赋值
}
- 在创建类的时候一定要提供一个无参和有参构造方法。
- 类的构造方法可以使用privete进行修饰,因为有一个设计模式(单例模式),需要将构造方法私有化才能保证创建的对象永远唯一。
(2)构造方法说明:
- 在不用单例设计模式的前提下,构造方法权限修饰符统一使用public。
- 不允许使用其他修饰符合返回值类型。
- 构造方法的名字是固定的,即与类名相同。
- 构造方法内部不能使用return关键字。