尽管Java是基于C++的,但是相比之下,Java是一种更“纯粹”的面向对象程序设计语言。Java语言假设我们只进行面向对象的程序设计。
2.1引用操纵对象
每种编程语言都有自己的操纵内存中元素的方式。所有这一切在Java里都得到了简化。一切都被视为对象,因此可以采用单一固定的语法。尽管一切都看作对象,但操纵的标识符实际上是对象的一个“引用”(reference)。这可能会引起争议:有人认为“很明显,它是一个指针” 。但是这种说法是基于底层实现的某种假设。并且,Java中的引用,在语法上更接近C++的引用而不是指针。
你拥有一个引用,并一定需要有一个对象与它想关联。
String s;
这里所差u那个见的只是引用,并不是对象。一种安全的做法是:创建一个引用的同时便进行初始化。
String s = "hello";
2.2必须由你创建所有对象
一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用“new”来实现:
String s = new String("hello");
2.2.1存储到什么地方
程序运行时,对象是怎么进行放置安排的呢?特别是内存是怎样分配的呢?
- 寄存器:根据需求进行分配。你不恩那个直接控制,也不能在程序中感觉到寄存器存在的任何迹象
- 堆栈:位于通用RAM中,堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便于上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些Java数据存储于堆栈中–特别是对象引用,但是Java对象并不存储于其中。
- 堆:一种通用的内存池,用于存放所有的Java对象。
- 常量存储:常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。
- 非RAM存储:数据完全存活于程序之外,基本的例子是”流对象”和“持久化对象”。
2.2.2特例:基本类型
在程序设计中经常用到一系列类型,它们需要特殊对待,可以把它们想象成“基本”类型。它们不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加高效。
基本类型具有包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。
Java提供了两个用于高精度计算的类:
- BigInter:支持任意精度的整数
- BigDecimal:支持任意精度的定点数
二者都没有对象的基本类型,但是任何对基本类型的操作同样适用于它们,只不过必须以方法调用的方式取代运算符实现,所以运算速度会比较慢。在这里我们以速度换取了精度。
2.2.3Java中的数组
当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用被自动初始化为null
还可以创建用来存放基本数据类型的数组。编译器也能确保这种数组初始化为0
2.3永远不需要销毁对象
基本数据类型,以及对象引用的作用域决定了它们的创建和销毁。在Java中,作用域由大括号({})来决定:
{ int x = 12; // Only x available { int q = 96; // Both x % q available } // Only x available, q is "out of scope" }
在Java中,不允许小作用域重新定义变量来“隐藏”大作用域变量,这样做容易导致程序混乱。
对象不受到作用域的限制
{ String s = new String("hello"); // object s available } // s is "out of scope",but object still available until jvm destroy
引用s在作用域终点就消失了。然而,s指向的String对象仍然占据内存空间,可以跨越作用域的限制,直到被Java的垃圾回收器自动回收。垃圾回收器通过对象是否存在指向其的引用来判断是否应该回收对象,上边的例子中,由于唯一指向String对象的引用s的消失,将自动被垃圾回收器回收
Categories: 读书笔记
Ya learn something new evearydy. It’s true I guess!