这是对Java编程思想第2章中知识点的总结。
尽管Java是基于C++的,但是相比之下,Java是一种更为“纯粹”的面向对象程序设计语言。在开始用Java进行设计
之前,必须将思想转换到面向对象的世界中来。
用引用操纵对象。一切都是对象,但操纵的标识符实际上是对象的一个“引用”(reference)。可以将这一情景想像
成用遥控器(引用)来操纵电视机(对象)。只要握住这个遥控器,就能保持与电视机的来连接。当有人想改变频道或者
改变音量时,实际操纵的是遥控器(引用),在由遥控器来调控电视机(对象)。
如果想操纵一个词或一个句子,则可以创建一个String引用:
String s;
但这里创建的只是引用,而不是对象。如果此时向 s 发送一个消息,就会返回一个运行时错误,这是因为你发送的这个
消息给 s ,而 s 并没有对象来操作。因此,为了安全起见,在创建一个引用的同时便进行初始化。
String s=“qiaotao”;
这里用到的是Java语言的一个特性,字符串可以用带引号的文本进行初始化。通常,必须对对象采用一种更通用的方式
进行初始化。
必须由你创建所有的对象。一旦创建了一个引用,就希望它能与一个新对象相关联。通常用 new 操作符来实现这一目的。
new 关键字的目的是“给我一个新对象。”所以前面的例子可以写成:
String s=new String(“qiaotao”);
程序运行时,对象是怎么进行安排放置的呢?特别是内存是怎么分配的呢?
有五个不同的地方可以存储数据:
(1).寄存器。 这是最快的存储区,因为它位于不同于其他存储区的地方(处理器内部)。但是寄存器的数量及其有限,
所以寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器的任何迹象。
(2).堆栈。位于通用RAM中(随机访问存储器),但可以通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若
向下移动,则开辟新的内存空间;若向上移动,则释放内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程
序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。某些Java数据存储于堆栈中,特
别是对象的引用,但是Java对象并不存储于其中。
(3).堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知
道存储的数据在堆里存活多长时间。当需要一个对象时,只需要 new 写一行简单的代码,当执行这段代码时,就会自动在
堆里进行存储分配。
(4).常量存储。常量值通常直接存放在程序代码内部。这样做是安全的,因它们永远不会被改变。
(5).非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。
其中两个基本的例子是流对象和持久化对象。在“流对象”中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”
中,对象被存放于磁盘上。
对于基本数据类型,之所以要特殊对待,是因为 new 将对象存储在“堆”里,故用 new 创建一个对象(特别是小的),
简单的变量,往往不是很有效的。因此对于基本数据类型,不同 new 来创建变量,而是创建一个并非是引用的“自动”变量。
这个变量直接存储“值”,并置于堆栈中,因此更加高效。
Java要确定每种基本数据类型所占存储空间的大小。这种所占存储空间大小的不变性是Java更具可移植性的原因之一。
基本数据类型具有对象包装类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。例如:
char x='c';
Character ch=new Character(x);
Java SE5的自动包装功能将自动的将基本类型转换为对象包装类型:
Character ch='x';
并可以反向转换:
char c=ch;
Java中提供了两个用于高精度计算的类:BigInteger和BigDecimal。虽然它们大体上属于“对象包装类”的范畴,但
二者都没有对应的基本类型。