- 1、本文档共66页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OOP 面向对象编程
OOP
AIA
什么是面向对象?
Object??? Oriendted?????? Programming
对象??? ? 以…为导向的 ? ?程序设计
面向对象就是使用对象进行程序设计,简写成OOP
面向过程? (SP)
面向对象(OOP)
设计思路
自顶向下、层次化、分解
自底向上、对象化、综合
程序单元
函数模块
对象
设计方法
程序 = 算法 + 数据结构
程序 = 对象 = 数据 + 方法
优点
相互独立,代码共享
接近人的思维方式
模拟客观世界
缺点
数据与程序不一致
维护困难
客观世界的无序性
概念不成熟
SP和OOP对比
一个示例
示例场景:
我们需要设计一个人事管理系统,其中的一个功能是对各种不同类型的员工,计算其当月的工资——不同类型的员工,拥有不同的薪金计算制度。
结构化做法
结构化做法
1.获得人事系统中所有可能的员工类型
?2.根据不同的员工类型所对应的不同的薪金制度,计算其工资?
enum EmployeeType
{
Engineer;
Sales;
Manager;
…
}
// 计算工资程序
if ( type == EmployeeType.Engineer)
{……}
else if (type == Employeetype.Sales)
{……}
面向对象设计
1.根据不同的员工类型设计不同的类,并使这些类继承自一个Employee抽象类,其中有一个抽象方法GetSalary。
?2.在各个不同的员工类中,根据自己的薪金制度,重写(override)GetSalary方法。
abstract class Employee
{…public abstract int GetSalary();}
class Engineer: Employee
{…
public override int GetSalary(){…}
}
class Sales: Employee
{…
public override int GetSalary(){…}
}
// 显示工资程序
Employee e = emFactory.GetEmployee(id);
MessageBox.Show( e.GetSalary());
示例场景:
现在需求改变了……随着客户公司业务规模的拓展,又出现了更多类型的员工,比如钟点工、计件工……等等,这对人事管理系统提出了挑战——原有的程序必须改变。
结构化做法
几乎所有涉及到员工类型的地方(当然包括“计算工资程序”)都需要做改变……这些代码都需要重新编译,重新部署…….
面向对象做法
只需要在新的文件里增添新的员工类,让其继承自Employee抽象类,并重写GetSalary()方法,然后在 EmployeeFactory.GetEmployee方法中根据相关条件,产生新的员工类型就可以了。其他地方(显示工资程序、Engineer类、 Sales类等)则不需要做任何改变。
重新认识面向对象
对于前面的例子,从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。
对象
?对象是面向对象编程的核心部分,是实际存在的具体实体,具有明确定义的状态和行为;
?对象其实就是“数据”和“函数”的封装体,其中:
数据表示自身的状态,也称作“属性”或“成员数据”;
函数表示自身的功能,也称作“方法”或“成员函数”。
类
人们为了更好地认识世界,将现实生活中的事物(对象)划分成类;
同一类中的事物总是具有一些共性。
类和对象的关系
类是用来描述实体的“模板”或“原型”;
对象是实际的实体,每一个对象都是类的一个具体实例。
Java OOP三大思想
封装
继承
多态
封装
隐藏实现细节,对外提供公共的访问接口,增强代码的可维护性
具体实现方式:属性私有化、添加公有的setter,getter方法
继承
多态
增强代码的可扩展性、维护性
同一个实现接口,使用不同的实例而执行不同操作。通过Java接口/继承来定义统一的实现接口;通过方法重写为不同的实现类/子类来定义不同的操作
静态的多态就是只函数的重载,动态的多态就是方法的覆写
原则:“左声明右实现”
这个原则可以在任何地方使用,包括在接口和抽象类中,软件初学者可以以这个原则来理解面向父类的编程方法。
父类
/***坦克类,它是所有坦克的父类*/
class Tank {
public void printTank()
{
System.out.println(This is Tank);
}
}
/***M1坦克类,它继承了坦克父类*/
class M1Tank extends Tank
{
//该方法重写了父
文档评论(0)