Java对象及其引用
先搞清楚什么是堆,什么是栈。
Java开辟了两类存储区域,对比二者的特点
堆栈的存储特点决定了其中存储的数据类型。
注意,栈内存储的除了基本类型的变量(int 这种类型的变量)还会存储对象的引用变量。
java中,引用变量实际上是一个指针,它指向的是堆内存中对象实例。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
MyClass mc; // 在栈中开辟了空间给引用变量mc,这时mc的值为null
mc=new MyClass();
// 1. new MyClass()在堆中开辟了空间给MyClass类的对象
// 2. 赋值运算符 "=" 把对象的地址赋值给引用变量mc
// 3. 即 new MyClass(); 返回的是对象的地址
// 4. mc的值是 MyClass类的对象地址 即mc指向了对象 所以我们能用mc访问堆中数据
当一个对象被构造了 却不使用 或 不被指向 那么会被垃圾回收机制回收了。
所以如下操作毫无意义
new MyClass();
new MyClass();
new MyClass(); // 这个3个对象没有引用变量指向 会被垃圾回收
- 匿名对象 <没有引用指向对象>
String s = new String("helloworld");
System.out.println(s);
System.out.println(new String("helloworld"));
System.out.println("helloworld");
在System.out.println("helloworld"); 中 String对象 "helloworld" 没有被指向 但被println函数使用了
在println函数用这个匿名对象时, 这个对象还在 ,一旦用完了 ,又因匿名对象没有引用指向,所以无法访问,匿名对象就会被回收。
- new的作用
MyClass[] mcs;
mcs = new MyClass[4]; //new 在栈中开辟了引用变量的空间 并返回了栈中地址
for(int i = 0; i < 4; i++)
{
mcs[i] = new Myclass(); //new 在堆中开辟了对象数据的空间 并返回对象的堆中地址 即引用指向了对象
}
mcs[i] 中的值 是对象的地址,即栈中保存的是对象地址,堆中保存的是对象数据。通过栈中地址就能找到堆中数据。