社区
Java SE
帖子详情
THINK IN JAVA 疑惑
song4
2007-03-14 05:54:08
THINK IN JAVA里面写到
“特别是对象引用的都放到堆栈里面”
而NEW出来的放在堆里面
但是,当我们申请数组时,为引用数组
那应该放到堆栈里面
可是数组是NEW出来的啊,不是矛盾么
className[] a=new className[5];
这个a[0]是个引用,存放到哪里呢??
...全文
865
21
打赏
收藏
THINK IN JAVA 疑惑
THINK IN JAVA里面写到 “特别是对象引用的都放到堆栈里面” 而NEW出来的放在堆里面 但是,当我们申请数组时,为引用数组 那应该放到堆栈里面 可是数组是NEW出来的啊,不是矛盾么 className[] a=new className[5]; 这个a[0]是个引用,存放到哪里呢??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
think in
java
第十六章数组 总结随笔
很多人开始对数组的了解: 1.数组的创建和组装,并通过整型的索引值去访问...在看本章之前,我一直存在一个
疑惑
,在像有List、Map、Set等等容器的存在下(在操作上比数组方便的情况下,在实际开发中大多也是用List、
think in
java
学习笔记(一)方法重载
有一个可能会令人
疑惑
的问题,下面代码会匹配哪一个 public void f(){System.out.println("null");} public void f(int...x){System.out.println("...");} public void f(int x){System.out.println("int");} ...
Java
I/O 系统 --think in
java
第十八章
格式化的内存输入:DataInputStream in=new DataInputStream(new ByteArrayInputStream(BufferedInputFile.read("FormattedMemoryInput.
java
").getbytes()));如果从DataInputStream用readByte()一次一个字节的读取...
think in
java
填充容器(事例简述)
在学习think in
java
在容器深入研究--填充容器这一章节,刚开始看到的例子很是迷惑,后来做了下仔细研究,现在分享下。 摘自think in
java
中的一段代码: //: net/mindview/util/CountingMapData.
java
// ...
《Think In
Java
》中一个【下推堆栈】类的代码分析
引子: 最近工作不是太忙,项目开发任务也大多完成了,于是又回过头来复习一些
Java
基础。刚刚,正好看到第15章——泛型,看到了15.2.2小节——一个堆栈类 部分的...该段代码位于《Think In
Java
》第四版 P625。 ...
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章