chapter1 对象导论
1.1抽象过程
面向对象程序设计的特性:
1.万物皆为对象
2.程序是对象的集合.
3.每个对象都有自己的由其他对象所构成的存储.
4.每个对象都拥有其类型.
5.某一特定类型的所有对象都可以接收同样的消息.
1.2每个对象都有一个接口
面向对象方法并不是仅局限于构建仿真程序.面向对象技术的应用可以将大量问题很容易降解为一个简单的解决方案.
1.3每个对象都提供服务
对象 比作 "服务提供者"(service provider)
建立系统,可以将问题分解为对象集合.
有助于提高对象的内聚性.(每个类都专门完成一个特定,通用的服务,一个类功能不能太多,分类封装,使其内聚性更高,复用性更强)
每个对象都有一个它所能提供服务的内聚的集合.
eg.检查打印模式的模块中,不应该由一个类完成所有格式和打印技术.
分为3个类,
一个类是所有可能的支票排版目录,用于查询如何打印支票信息;
一个类是通用的打印接口,知道所有不同类型的打印机的信息
一个类是通过调用以上两个类的服务来完成打印任务.
1.4被隐藏的具体实现
程序开发人员分为(按角色):
类创建者(创建新数据类型)
客户端程序员(在应用中使用数据类型的类消费者)
他们关注点不一样
后者收集用来实现快速应用开发的类.
前者构建类,只向后者暴露必需的部分,隐藏其他部分.(好处:保护程序脆弱部分,不容易被毁坏而出现bug)
涉及 访问指定词(access specifier)
public private protected default(包访问权限)
1.5复用具体实现
设计可复用的对象需要丰富的经验和敏锐的洞察力.(有用的代码单元)
复用方式:
直接调用对象
创建成员对象(组合composition)
动态产生成员对象(聚合aggregation) has-a拥有关系 eg.汽车拥有引擎
有时候可以将不必要的继承用组合的方式实现.
1.6继承
通过抽象将通用的方法抽取出来成为接口, 构成类型层次,使得同一个大类的不同实现的代码得以统一和简化.
区别化基类和子类的方法:
子类添加新方法/属性.
子类覆盖旧方法.
1.6.1 "是一个" 与 "像是一个" 关系
替代原则(相当于副本, is-a 关系)
扩展接口,新增新方法,(is-like-a关系)
1.7伴随多态的可互换对象
非面向对象编程的编译器产生的函数调用:前期绑定
面向对象编程编译器:后期绑定
(后期绑定:
当向对象发送消息时,被调用的代码直到运行时才能确定.编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码)
向上转型(upcasting)子类做基类
向下转型(downcasting)基类做子类
1.8单根继承结构
单继承使对象在堆上创建更容易.参数传递也得到简化.
1.9容器
不知道解决特定问题需要多少个对象,也不知道存活多久,因此如何存储对象是个问题.
只有在运行时才会知道上面问题的答案.
所以,创建容器对象处理所有细节.
java类库有满足不同需要的各种类型的容器:
list(用于存储序列)
map(关联数组,用于建立对象之间的关联)
set(每种对象类型只持有一个)
队列
树
堆栈
选择容器条件2个:
1.不同容器提供不同类型的接口和外部行为.
2.不同容器对于不同操作效率不一.
eg. ArrayList & LinkedList
随机访问 ArrayList 效率高
插入数据 LinkedList 效率高
解决:接口list 的抽象,把在容器间进行装换时对代码产生的影响降到最小限度.
用linkedList构建程序,优化系统性能时改用arraylist .
1.9.1参数化类型(泛型)
原本容器容纳的都是object类型,使得对象本身身份丢失,取出后要向下转型,而向下转型不安全,容易抛异常,所以出现泛型,定义容器只接收该泛型指定的数据类型.
ArrayList
1.10对象的创建和生命期
垃圾回收机制
1.11异常处理:处理错误
从出错点抛出,被专门设计用来处理特定类型错误的异常处理器捕获.
1.12并发编程
多线程(安全隐患:共享资源 解决:锁定资源,使用完毕释放)
1.13java与internet