博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Think in Java笔记(1)

Posted on 2014-12-17 20:13  Dr.函兽  阅读(168)  评论(0)    收藏  举报

第1章.对象导论

“对象具有行为、状态和标识。” —— Booch

1. is-a 和 is-like-a

结果可以用一个导出类对象来完全替代一个基类对象。这可以被视作纯粹替代,通常称之为替代原则。某种意义上这是一种处理集成的理想方式,我们称之为is-a关系。有时必须在导出类型中扩展接口,这给新类仍可以替代基类,但这种替代并不完美。这种情况我们描述为is-like-a关系。

2. 多态

前期绑定:编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。

后期绑定:当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。

在处理类型的结构时,经常把一个对象不当做它所属的特定类型对待,而是把它当做基类的对象对待。将导出类看做是它的基类的过程称为upcasting,正是upcasting的存在让程序从具体的某种类型的泥淖中解放出来。

3. 动态内存分配(对象的创建和生命期)

Java完全采用了动态内存分配方式。该方式在被称为堆(heap)的内存池中动态的创建对象,这样直到运行时才知道需要多少对象,它们的生命周期如何以及它们的具体类型是什么。因为内存空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这比采用栈方式的效率低得多。在栈中分配和释放存储空间各只需要一条汇编指令,使栈顶指针在向上或向下,而在堆中创建存储空间的时间则依赖于存储机制的设计。

动态方式有一个一般性的逻辑假设:对象趋于变得复杂,所以查找和释放存储空间的开销不会对对象的创建产生重大冲击。动态方式所带来的更大的灵活性正是解决一般化编程问题的要点所在。

还有一个议题是关于对象生命周期。对于允许在栈上创建对象的语言,编译器可以确定对象存活时间并自动销毁。然而在堆上创建对象,编译器就对它的生命周期一无所知。在C++中必须人工确定何时销毁,java提供了”垃圾回收“机制用来处理内存释放问题。

“内存回收”机制,同单根继承、以及完全采用动态内存分配这两个特性结合起来使得java编程过程要简单得多。