1)Java程序运行时,对象是怎么进行安排放置的,内存是怎么分配?Eckel在Thinking in java中对五个不同的存储数据的地方进行了简要的介绍:
a. 寄存器。最快的存储区(位于处理器内部),在Java里面,你不能直接控制,也不能在程序中感觉到寄存器的存在,可能是出于安全原因的考虑吧(C和C++允许编译器建议寄存器的分配方式);
b. 堆栈。位于通用RAM,随即访问存储器中,但通过堆栈指针可以从处理器那里获得直接支持。由于仅通过指针的上下移动即可控制内存,所以速度上仅次与寄存器 。然而Java系统需要知道存储在堆栈的所有项的生命周期,所以灵活性不高。因此一般只存储对象的引用,而不直接存储对象(基本类型一般也存放在这里的)
c. 堆。通用的内存池,也位于RAM。一般存放所有对象。堆是不用知道存储的数据的存活时间的,当需要一个对象的时候,通过new即可在堆里进行存储分配,这多少导致在清理堆的数据的不灵活性(基本类型的包装器类存储在堆中,也就是它是靠引用而“存活”的)
d. 常量存储。常量值通常直接存放在程序代码内部。在必要的情况下,可以选择将其放在ROM中(字符串池正是这样的一个例子)
e. 非RAM存储。放在非RAM存储中目的主要是为了让数据存活在程序之外,其中两个基本的例子是流对象和持久化对象
2)在Java中,所有数值类型都有正负号,所以不要寻找无符号的数值类型;
3)boolean类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true或false;
4)JavaSE5 自动包装功能将自动将基本类型转换为包装器类型:
Character ch = 'x';
并可以方向转换, char c = ch;
5)Java不允许重复定义相同名字的基本类型(C/C++可以)
{
int x = 12;
{
int x = 1; // Illegal
}
}
6)基本类型的作用域和对象的作用域都受限于花括号“{}”,一旦超出它们所在的花括号,那它们就消失了。但基本类型的消失是指在堆栈中的内存被收回,而对象的消失只是在堆栈中的存放对象引用的内存被收回,但其对象(堆中的)还存活,除非立刻通过垃圾回收机制回收了。这样的设计有利于字符串池的实现
7)若类的某个成员是基本数据类型,即使没有进行初始化,也会获得一个默认值。然而对于“局部”变量,即并非某个类的字段,比如在某个方法在定义的,如果没有进行初始化,Java系统在编译的时候会报错的。