1.Java中一切都被视为对象,但操作的标识符实际是对象的一个引用(reference),可以将这一情形想象成遥控器(reference)操纵电视机(Object).
String s = null;
这里创建的只是引用,而不是对象。
2.程序运行时有5个不同的地方可以存储数据。
寄存器 最快的存储区,位于处理器内部,由编译器来分配。
堆栈 位于通用RAM(随机访问存储器)中
优点:存取速度比堆要快,仅次于寄存器,栈数据可以共享。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。
局限:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
存储:基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和对象的引用
堆 也位于RAM中
优点:在运行时动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。
局限:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。
存储:存放用于new出来的JAVA对象和数组。
常量存储 通常直接存储在程序代码内部
非RAM存储 如果数据完全存活于程序之外,那么它可以不受程序的任何控制,例如流对象和持久化对象。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
示例代码:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
成员变量和局部变量:
成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象里面,由垃圾回收器负责回收。