THINK IN JAVA 疑惑

song4 2007-03-14 05:54:08
THINK IN JAVA里面写到
“特别是对象引用的都放到堆栈里面”
而NEW出来的放在堆里面
但是,当我们申请数组时,为引用数组
那应该放到堆栈里面
可是数组是NEW出来的啊,不是矛盾么
className[] a=new className[5];
这个a[0]是个引用,存放到哪里呢??
...全文
865 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qfs_v 2007-03-20
  • 打赏
  • 举报
回复
简单解释:

String str = new String("Java");

str是个对象变量。可以也只可以存放String类型的引用。
对象都是在堆中构造的。
String("Java");是调用constructor初始化对象,构造一个对象实例。
new 是动态为对象分配个地址,他的返回值是个引用(也就是个指针)赋给对象变量str。

gaviner 2007-03-16
  • 打赏
  • 举报
回复
className[] a; //是一个引用,初始值为null
new className[2];//是一个实例,这两行没有联系,

className[] a = new className[2]; //引用指向了实例,即a的值为实例的地址
Rain 2007-03-15
  • 打赏
  • 举报
回复
是的
说的我也知道
但是想这里
a[0]是NEW出来的吧
应该在堆里
a[0]是引用吧
应该在堆栈里
那么a[0]到底在哪??

-----------------------------
a[0]中的内容是new出来的
a[0]是一个引用,它保存指向其内容的地址
我们通常说的a[0]的值是说a[0]中指向的地址中的值.

所以a[0]是引用,在堆栈里,
a[0]的值在堆里
yuyunliuhen 2007-03-15
  • 打赏
  • 举报
回复
开始也不大清楚,现在明白了,呵呵
Hypercube1024 2007-03-15
  • 打赏
  • 举报
回复
楼主的数组问题a[0]显然是放在堆中的,
而且不是所有的引用都是在栈里面的例如实例变量
class A
{
Object o;
}
如果A a=new A();这个时候a是放在栈里面的,然而实例变量o是放在堆中的。
scjp的官方教程写的很清楚,准确的讲实例变量和new出来的是放在堆中,局部变量是放在栈中的。
song4 2007-03-15
  • 打赏
  • 举报
回复
是的
说的我也知道
但是想这里
a[0]是NEW出来的吧
应该在堆里
a[0]是引用吧
应该在堆栈里
那么a[0]到底在哪??

-----------------------------
Dan1980 引用不在堆栈里么??
a[]不是引用数组么
song4 2007-03-15
  • 打赏
  • 举报
回复
谢谢,终于有说到地方的了
太感谢了
那这个a[0]既是引用
又在堆了咯?
(我是这么想的,想听听大家看法)
haoyan5520165 2007-03-15
  • 打赏
  • 举报
回复
String []a = new className[5]实际上是String a[];a=new className[5];
这时a就是引用变量 (栈中)指向数组的首地址 即a[0] (数组是一块连续的内存地址) ,而a[0]-a[4]的值放在堆中 .是new出来的.这里的a[0]等是不存在具体的内存空间的 存在的是它的值
定义a[0]等是为了检索方便!
要想释放 就可以使a = null; 这时new 的数组还在堆中 只是a不指向了 成了垃圾 不定时gc.
在堆中数组的元素的初始值为0 .
在数组在用时必须有一个有效的数组对象(new 或用静态数组)不然回出现数组越界错误!
asdfasdf123 2007-03-15
  • 打赏
  • 举报
回复
是的,就是这样。
hhtwya 2007-03-15
  • 打赏
  • 举报
回复
a[0]是对象的引用,存放在栈里,
a[0]指向在值是一个对象,存放在堆里
lovekker 2007-03-15
  • 打赏
  • 举报
回复
楼上说的很明白..
如果
int[] a = new int[10];

System.out.println(a);//得到的会是一个地址..
song4 2007-03-15
  • 打赏
  • 举报
回复
a[0]中的内容是new出来的
a[0]是一个引用,它保存指向其内容的地址
我们通常说的a[0]的值是说a[0]中指向的地址中的值.

所以a[0]是引用,在堆栈里,
a[0]的值在堆里
------------------------
a[0]本身的地址不也是NEW出来的么??
className a[]=new className[5];
a[0] a[1].......
diracstar 2007-03-14
  • 打赏
  • 举报
回复
"对象的值" 和"对象的内容" 是两个不同的概念;
className[] a=new className[5];
a[0]是"对象的值"即"对象的引用",它的值是一个地址(指向一个内存空间(在这个内存中存放了对象的内容));
又因为引用存放在栈中,对象存放在堆中;
所以a[0]存放在栈中,而a[0]所指向的对象存放在堆中;
Dan1980 2007-03-14
  • 打赏
  • 举报
回复
对此有疑问的请去看SCJP的官方教材,对对象的存储有非常详细的解释。
Dan1980 2007-03-14
  • 打赏
  • 举报
回复
错了。
a[0]是存放在堆中的,整个数组结构(包括每个元素)都是存放在堆中。数组元素(引用)所指的对象当然也是存放在堆中。
song4 2007-03-14
  • 打赏
  • 举报
回复
那a[0]不是NEW出来的么??
lower0661 2007-03-14
  • 打赏
  • 举报
回复
a[0]在栈里阿
new出来的是a指向的内存区域,和a[0]没有关系阿~

现在a[0]是null,在栈中。
a[0]= new className();之后a[0]所指的对象在堆中。
没有矛盾
qfs_v 2007-03-14
  • 打赏
  • 举报
回复
参考《JAVA 2核心技术 1》 的 对象和对象变量 这节。
你就清楚一些了。
retaste 2007-03-14
  • 打赏
  • 举报
回复
a是引用,对象是new className[5];
引用指向对象,引用存放在栈,对象在堆中.
song4 2007-03-14
  • 打赏
  • 举报
回复
是啊
但是
我问a[0]应该在那里呢?
他是NEW出来的吧?
他是引用吧?
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧