CH1 对象导论
文章目录
1.1抽象过程
- 将问题空间中的元素及其在解空间上的表示称为 对象
- 面向对象思想实质:程序可以添加新类型的对象
使自身适用于某种问题
1.2每个对象都有一个接口
- 创建抽象数据类型(类)是面向对象程序设计的基本概念之一。
- 类描述了具有相同特性(数据元素)和行为(功能)的对象集合。
- 接口 确定了对某一特定对象所能发出来的 请求
- 每一个请求都与一个方法相关联
- 满足这些请求的代码与隐藏的数据构成了 实现
- UML(Unified Modelling Language,统一建模语言)
- 每个类都用一个方框表示
- 类名在方框的顶部
- 数据成员在方框中间
- 方法在底部
- 通常只有 类名和公共方法 被表示在图中
1.3每个对象都提供服务
当正在试图开发或理解一个程序设计时,最好的方法之一就是 将对象想像成”服务的提供者“。去调用或创建可以提供这一服务的对象
-
好处:
1. 将问题分解为对象的集合 2. 提高对象 **内聚性**
1.4被隐藏的具体实现
程序开发人员按角色分为 类创建者 和 客户端程序员 是大有裨益的。
-
类创建者的目标是构建类,这种类只向客户端程序员暴露必须的部分而隐藏其他部分。
-
客户端程序员的目标是 收集各种用来快速应用开发的类。
-
类访问限制符
- public
- private
- protected
- default(没有使用上述三者之一,就为默认)
1.5复用的具体实现
- 组合(composition)
- 继承
优先使用组合
1.6 继承(extends)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HwQt2HLH-1576936805741)(en-resource://database/404:1)]
-
导出类必须有其特定的实现,否则继承没有意义。有两种方法可以使二者产生差异
- 在导出类中添加新方法
- 覆盖 (overriding):改变基类现有方法
1.6.1是一个 与 像是一个 关系
- 是一个( is-a ): 继承只 覆盖 基类方法。导出类与基类是完全相同的类型,因为他们具有 完全相同 的接口。
- 像是一个(is-like-a): 扩展了接口
1.7伴随多态的可互换对象
在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将其当作基类的对象来对待。
如此可以写出不依赖特定类型的代码。方法的操作都是 泛化(generic) 的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJ2gEcHD-1576936805741)(en-resource://database/408:1)]
此为 多态 。面向对象编译器做的是 后期绑定 (即运行时才能确定具体代码的地址),而传统编译器做的是 前期绑定 。
- 在 c++中使用 virtual 关键字来实现 动态绑定(后期绑定)。而java中动态绑定是默认行为。
向上转型(upcasting)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38IYX43o-1576936805742)(en-resource://database/412:1)]
1.8 单根继承结构
在java (事实上还包括除C++外的所有OOP语言),都继承自一个单一基类,其就是 Object。
好处:
1. 所有对象都具有一个公用的接口。
2. 单根继承结构保证所有对象都具备某些功能。所有对象都可以容易的再堆上创建,参数传递过程也得到极大简化。
3. 单根继承使得垃圾回收机制实现变得容易的多,而垃圾回收机制正是Java对C++的重要改进之一。
1.9 容器
创建另一种对象类型,这种新的对象类型持有对其他对象的引用。其通常被称为容器(集合)。在任何需要的时候都可以扩充自己以容纳你置于其中的东西。因此不需要知道将来会把多少个对象至于容器中,只需要创建一个容器对象,然后让它处理所有细节。
1.9.1参数化类型
在 JavaSE5 中加入了参数化类型,其被称为泛型。
例:
ArrayList<Shape> shapes=new ArrayList<Shape>();
ps:在其之前容器中存储的都是通用存储类型Object。这意味着,在取回时得到的是Object类型的引用,为了得到具体类型,就要的 向下转型。这可能是不安全的。
1.10对象的创建和生命期
在使用对象时,关键的问题之一便是他们的生成和销毁方式。每个对象为了生存都需要资源,尤其是内存。当我们不需要某个对象时,它必须清理掉。
对象存放在何处
- 堆栈(栈)
这种方式将存储空间分配和释放置于首要地位。有时利于控制但是牺牲了灵活性,因为必须知道对象确切的数量,生存周期和类型。 - 堆(heap)
这种方式是在被称为堆的内存池中创建对象。这种方式知道运行时才知道要多少对象,它们的生命周期及具体类型。
-
因为存储空间是在运行时动态管理的,所以需要大量时间在堆中分配存储空间。这远大于在栈中创建存储空间的时间,在栈中存储和释放存储空间分别只需要一条汇编命令即可,分别对应将栈顶指针向下和向上移动。而
堆依赖于存储机制。 -
Java采用了完全动态内存分配的方式。
-
在栈上的对象,编译器可以确定的存活时间,并可以自动销毁它。
-
在堆上的对象,编译器对其生命周期一无所知。
-
Java的垃圾回收器被设计用来处理内存释放问题。这一点得益于 单根继承和 只能在堆上创建对象
1.11异常处理:处理错误
Java内置了异常处理机制
1.12并发编程
同一时刻处理多个任务。
隐患:资源共享
解决方法: 锁
1.13 Java与Internet
1.13.1 web是什么
客户/服务器模型
核心思想:系统具有一个中央信息存储池(central repository of infomation),用来存储某种数据,它通常存在于数据库中,你可以根据需要将它分发给某些人或机器集群。
- 服务器:信息存储池,用于分发信息的软件以及信息及软件所驻留的机器被称为服务器。
- 客户机:获取处理显示这些信息的机器叫做客户机。
- 事务处理:保证一个客户插入新的数据不会覆盖另一个客户插入的数据,也不会在插入的过程中丢失。
- 中间件:将负载分散在服务器端的其他机器。(中间件也被用来提高可维护性)
1.14总结
理解OOP,根据需要选择相应的语言。