THINK IN JAVA里面写到
“特别是对象引用的都放到堆栈里面”
而NEW出来的放在堆里面
但是,当我们申请数组时,为引用数组
那应该放到堆栈里面
可是数组是NEW出来的啊,不是矛盾么
className[] a=new className[5];
这个a[0]是个引用,存放到哪里呢??
“特别是对象引用的都放到堆栈里面”
而NEW出来的放在堆里面
但是,当我们申请数组时,为引用数组
那应该放到堆栈里面
可是数组是NEW出来的啊,不是矛盾么
className[] a=new className[5];
这个a[0]是个引用,存放到哪里呢??
但是
我问a[0]应该在那里呢?
他是NEW出来的吧?
他是引用吧?
引用指向对象,引用存放在栈,对象在堆中.
你就清楚一些了。
new出来的是a指向的内存区域,和a[0]没有关系阿~现在a[0]是null,在栈中。
a[0]= new className();之后a[0]所指的对象在堆中。
没有矛盾
className[] a=new className[5];
a[0]是"对象的值"即"对象的引用",它的值是一个地址(指向一个内存空间(在这个内存中存放了对象的内容));
又因为引用存放在栈中,对象存放在堆中;
所以a[0]存放在栈中,而a[0]所指向的对象存放在堆中;
说的我也知道
但是想这里
a[0]是NEW出来的吧
应该在堆里
a[0]是引用吧
应该在堆栈里
那么a[0]到底在哪??-----------------------------
Dan1980 引用不在堆栈里么??
a[]不是引用数组么
说的我也知道
但是想这里
a[0]是NEW出来的吧
应该在堆里
a[0]是引用吧
应该在堆栈里
那么a[0]到底在哪??-----------------------------
a[0]中的内容是new出来的
a[0]是一个引用,它保存指向其内容的地址
我们通常说的a[0]的值是说a[0]中指向的地址中的值.所以a[0]是引用,在堆栈里,
a[0]的值在堆里
a[0]是一个引用,它保存指向其内容的地址
我们通常说的a[0]的值是说a[0]中指向的地址中的值.所以a[0]是引用,在堆栈里,
a[0]的值在堆里
------------------------
a[0]本身的地址不也是NEW出来的么??
className a[]=new className[5];
a[0] a[1].......
如果
int[] a = new int[10];System.out.println(a);//得到的会是一个地址..
这时a就是引用变量 (栈中)指向数组的首地址 即a[0] (数组是一块连续的内存地址) ,而a[0]-a[4]的值放在堆中 .是new出来的.这里的a[0]等是不存在具体的内存空间的 存在的是它的值
定义a[0]等是为了检索方便!
要想释放 就可以使a = null; 这时new 的数组还在堆中 只是a不指向了 成了垃圾 不定时gc.
在堆中数组的元素的初始值为0 .
在数组在用时必须有一个有效的数组对象(new 或用静态数组)不然回出现数组越界错误!
而且不是所有的引用都是在栈里面的例如实例变量
class A
{
Object o;
}
如果A a=new A();这个时候a是放在栈里面的,然而实例变量o是放在堆中的。
scjp的官方教程写的很清楚,准确的讲实例变量和new出来的是放在堆中,局部变量是放在栈中的。
new className[2];//是一个实例,这两行没有联系,className[] a = new className[2]; //引用指向了实例,即a的值为实例的地址
对象都是在堆中构造的。
String("Java");是调用constructor初始化对象,构造一个对象实例。
new 是动态为对象分配个地址,他的返回值是个引用(也就是个指针)赋给对象变量str。