Java引用
Java引用和C++的引用是很不相同的,要了解Java引用,先了解一下下面两个概念:
Java内存分配中的栈
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
Java内存分配中的堆
堆内存用来存放由 new 创建的对象和数组。在堆中分配的内存,由JVM的自动垃圾回收器来管理。
在堆中产生一个对象或数组以后,还可以在栈中定义一个特殊的变量,让栈中这个变量额度取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成为了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。
引用变量是普通的变量,定义时在栈中分配,在程序运行到作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用new产生数组或对象的语句所在的代码块之外,数组和对象本身占据的内存不会释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能被使用,但仍然占据内存空间,在随后的一个不确定时间才会被垃圾回收器释放。这也是Java比较占内粗的原因。
从上面两个概念可以看出,实际上,栈中的变量指向堆内存中的变量,这就是Java中的“指针”。
例子:
public void swap(ClassA a,ClassA b){
ClassA tmp = a;
a = b;
b = tmp;
}
ClassA ca = new ClassA();
ClassA cb = new ClassA();
swap(ca,cb);
//交换后,ca还是ca,cb还是cb
因为通过new 创建的对象 引用放在栈内存中,而具体的值放在堆中,这个只是指向堆的地址变了,实参指向的地址没有变化既对象的引用指向的地址没有发生变化
微信扫码关注
更新实时通知
评论列表: