数据要保存在堆栈里——特别是对象句柄,但 Java 对象并不存储于其中。
(3)堆。一种通用的内存池(也在 RAM 区域),用于存放所有的 Java 对象。和堆
栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少
存储空间,也不必知道存储的数据要在堆里停留多长时间。因此,用堆保存数据时会得到
更大的灵活性。要求创建一个对象时,只需要用 new 命令编制相关的代码即可。执行这
些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然付出一定的代
价:在堆里分配存储空间时会花掉更长的时间(如果确实可以在 Java 中像在 C++中一样
在栈中创建对象)。
(4)常量存储。常数值通常直接置于程序代码内部。这样做是安全的,因为他们永远
都不会改变。有的常数需要严格地保护,所以可考虑将他们置入只读存储器(ROM)。
(5)非 RAM 存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并
在程序的控制范围之外。其中两个最重要的例子便是“流式对象”和“持久化对象”。对于流式
对象,对象会转化成字节流,通常会发给另一台机器。而对于持久化对象,对象保存在磁
盘中。即使程序中止运行,他们仍可保持自己的状态不变。对于这些类型的数据存储,一
个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将他们恢复成普通的 、
基于 RAM 的对象。Java 提供了对轻量级持久化的支持,而诸如 JDBC 和 Hibernate 这样
的机制提供了更加复杂的对数据库中存储和读取对象信息的支持。
1.2.2 特例:基本类型
在程序设计中经常用到一系列类型,他们需要特殊对待。可以把他们想像成“基本”类
型。之所以特殊对待,是因为 new 将对象存储在“堆”里,故用 new 创建一个对象——特
别是小的、简单的变量,往往不是很有效。因此,对于这些类型,Java 采取与 C 和 C++
相同的方法。也就是说,不用 new 来创建变量,而是创建一个并非是引用的“自动”变量。
这个变量直接存储“值”,并置于堆栈中,因此更加高效。
Java 要确定每种基本类型所占存储空间的大小。他们的大小并不像其他大多数语言那
样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他
大多数语言编写的程序更具可移植性的原因。所有数值类型都有正负号,所以不要去寻找
无符号的数值类型。Boolean 类型所占存储空间的大小没有明确指定,仅定义为能够取字
面值 true 或 false。基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用
来表示对应的基本类型。例如: