Update 03-Objects-Everywhere.md

This commit is contained in:
LingCoder
2019-01-09 12:31:39 +08:00
committed by GitHub
parent 2836f02e8e
commit d7f87f7db9

View File

@@ -9,7 +9,7 @@
<!-- You Manipulate Objects with References --> <!-- You Manipulate Objects with References -->
## 对象操纵 ## 对象操纵
名字的意义在于,我们听到“玫瑰”,就会想到一种闻起来很甜蜜的的花。(引用自 莎士比亚,《罗密欧与朱丽叶》)。 名字的意义在于,我们听到“玫瑰”这个词时,就会想到一种闻起来很甜蜜的的花。(引用自 莎士比亚,《罗密欧与朱丽叶》)。
所有的编程语言都会操纵内存中的元素。有时程序员必须要有意识地直接或间接地操纵它们。示例:在 C/C++ 语言中是通过指针来完成操作的。 所有的编程语言都会操纵内存中的元素。有时程序员必须要有意识地直接或间接地操纵它们。示例:在 C/C++ 语言中是通过指针来完成操作的。
@@ -46,9 +46,9 @@ Java 语法允许我们使用带双引号的文本内容来初始化字符串。
1. **寄存器** *Registers* 最快的保存区域位于CPU内部 [^2]。然而寄存器的数量十分有限所以寄存器是根据需要由编译器分配。我们对其没有直接的控制权也无法在自己的程序里找到寄存器存在的踪迹另一方面C/C++ 允许开发者向编译器建议寄存器的分配)。 1. **寄存器** *Registers* 最快的保存区域位于CPU内部 [^2]。然而寄存器的数量十分有限所以寄存器是根据需要由编译器分配。我们对其没有直接的控制权也无法在自己的程序里找到寄存器存在的踪迹另一方面C/C++ 允许开发者向编译器建议寄存器的分配)。
2. **栈内存***Stack* 存在于通用随机存取存储器RAM区域中可通过栈指针获得处理器的直接支持。栈指针下移动以创建新内存并向上移动以释放该内存后进先出速度仅次于寄存器。创建程序时Java 编译器必须准确地知道栈内保存的所有数据的“长度”以及生命周期。这种约束限制了程序的灵活性。因此,虽然栈内存上存在一些 Java 数据,特别是对象引用,但 Java 对象本身却是保存在堆内存的。 2. **栈内存***Stack* 存在于常规内存RAM区域中可通过栈指针获得处理器的直接支持。栈指针下移创建新内存,上移释放该内存,顺序后进先出速度仅次于寄存器。创建程序时Java 编译器必须准确地知道栈内保存的所有数据的“长度”以及生命周期。栈内存的这种约束限制了程序的灵活性。因此,虽然栈内存上存在一些 Java 数据,特别是对象引用,但 Java 对象本身却是保存在堆内存的。
3. **堆内存***Heap* 这是一常规用途的内存池(也在 RAM区域所有 Java 对象都存在于其中。与栈不同,编译器不需要知道对象必须在堆上停留多长时间。因此,用堆内存保存数据更具灵活性。创建一个对象时,只需用 new 命令实例化代码即可。执行这些代码时,数据会在堆内存里自动进行保存。这种灵活性是有代价的:分配和清理堆内存要比栈内存需要更多的时间(如果你甚至可以用 Java 在栈内存上创建对象就像在C++ 中那样。随着时间的推移Java 的堆内存分配机制现已非常快,因此这不是一个值得关心的问题了。 3. **堆内存***Heap* 这是一常规用途的内存池(也在 RAM区域所有 Java 对象都存在于其中。与栈内存不同,编译器不需要知道对象必须在堆内存上停留多长时间。因此,用堆内存保存数据更具灵活性。创建一个对象时,只需用 new 命令实例化代码即可。执行这些代码时,数据会在堆内存里自动进行保存。这种灵活性是有代价的:分配和清理堆内存要比栈内存需要更多的时间(如果你甚至可以用 Java 在栈内存上创建对象就像在C++ 中那样。随着时间的推移Java 的堆内存分配机制现已非常快,因此这不是一个值得关心的问题了。
4. **常量存储** *Constant storage* 常量值通常直接放在程序代码中因为它们永远不会改变。如需严格保护可考虑将它们置于只读存储器ROM中 [^3]。 4. **常量存储** *Constant storage* 常量值通常直接放在程序代码中因为它们永远不会改变。如需严格保护可考虑将它们置于只读存储器ROM中 [^3]。