java的内存分配问题

pricks 2014-08-12 09:37:08
加精
有一个自定义类:
class A{
int a=0;
int b=0;
String s="abc";

A a=null;
A b=new A();

public void f1(){
A c=new A();
}

public void f2(){
String s2="bcd";
}
}
然后主函数main()中这样调用:
main(){
A a=new A();
a.f1();
a.f2();
}

有以下问题请教:
1、主函数中,当执行A a=new A()时,我们知道,a相当于指针,被分配在栈中;new A()才是真正的对象,被分配在堆中。那么,a实例中的引用类型成员变量a和b此时如何分配内存的,分配在哪?指针和实例都在堆中吗?
另外,a实例中的字符串成员变量s是被分配在内存的哪个区域?常量区还是堆区?
2、当执行a.f2()语句时,字符串s2的值"bcd"是被分配在堆区,还是常量池?

请大神不吝赐教!
...全文
2904 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jukewu 2014-09-11
  • 打赏
  • 举报
回复
路漫漫其修远兮!
NGU_ALLIN 2014-09-05
  • 打赏
  • 举报
回复
新手报到!!
梧桐倚潇湘 2014-08-21
  • 打赏
  • 举报
回复
java 刚开始
xiaosana03 2014-08-21
  • 打赏
  • 举报
回复
厉害,喜欢,用一下
Corder 2014-08-20
  • 打赏
  • 举报
回复
Corder 2014-08-20
  • 打赏
  • 举报
回复
呵呵,什么东东
sxqxxhmsc 2014-08-20
  • 打赏
  • 举报
回复
喜欢使用。谢谢!
alanke11 2014-08-20
  • 打赏
  • 举报
回复
我也在学习这个玩意
dongcx1234567 2014-08-18
  • 打赏
  • 举报
回复
建议看下《深入理解java虚拟机》第二版,第二章说的很详细,
极限雨寒 2014-08-17
  • 打赏
  • 举报
回复
还得慢慢的地去学习下
lorabit_cn 2014-08-15
  • 打赏
  • 举报
回复
对象都new出来了 不是static的成员变量 明显和对象一起。。。
hugh_z 2014-08-13
  • 打赏
  • 举报
回复
learning
cattpon 2014-08-13
  • 打赏
  • 举报
回复
不同的Java虚拟机有不同的实现.
qq_19461277 2014-08-13
  • 打赏
  • 举报
回复
java还未入门
  • 打赏
  • 举报
回复
JAVA还未入门
gaofuqi 2014-08-12
  • 打赏
  • 举报
回复
首先了解一下对象的内存布局,(以HotSpot虚拟机为例子)主要分为: 1.对象头,主要是对象自己运行时数据(包括hashCode、gc分代年龄、线程持有的锁、锁状态标识等等)和对象的类型; 2.实例数据,是对象真正有效数据; 3.对齐填充,用于占位符; =============================================================================================== 1、主函数中,当执行A a=new A()时,我们知道,a相当于指针,被分配在栈中;new A()才是真正的对象, 被分配在堆中。那么,a实例中的引用类型成员变量a和b此时如何分配内存的,分配在哪?指针和实例都在堆中吗? 另外,a实例中的字符串成员变量s是被分配在内存的哪个区域?常量区还是堆区? 答: 1.a实例中怎么会出现名称相同的字段(a和b)? 2.a实例的a和b.无是基本类型还是引用类型都在堆中,只是他们指向的值或对象可能是堆中也可能在常量池中; 3.成员变量s也是在堆,s指向的常量池中的常量"bcd"的地址 ============================================================= 2、当执行a.f2()语句时,字符串s2的值"bcd"是被分配在堆区,还是常量池? 答:"bcd"是在常量池中,而s2是在栈中;
致知Fighting 2014-08-12
  • 打赏
  • 举报
回复
1、主函数中,当执行A a=new A()时,我们知道,a相当于指针,被分配在栈中;new A()才是真正的对象,被分配在堆中。那么,a实例中的引用类型成员变量a和b此时如何分配内存的,分配在哪?指针和实例都在堆中吗? 对象在堆里,基础变量在栈里 另外,a实例中的字符串成员变量s是被分配在内存的哪个区域?常量区还是堆区? 这个字符串是预赋值的,相当于常量,在常量池,也就是方法区里 2、当执行a.f2()语句时,字符串s2的值"bcd"是被分配在堆区,还是常量池? 但凡你在代码里看到的="string"这种类型的东西,全部都在常量池里
  • 打赏
  • 举报
回复
所以A实例中s是分配到栈空间的,而他的值"abc"是在堆空间和字符串池的。 同理 字符串s2的值"bcd"是被分配在堆区和字符串池了。。
  • 打赏
  • 举报
回复
亲,不要太纠结~ 哈哈 我说说我的理解: 首先,你说的A实例中, 所有的变量名:a、b、c、s 包括后面的s2 都是在栈空间中的,它就是你说的一个指针,指向堆空间中的对象。 其次,就要弄起字符串的特殊之处了,字符串的话,他的创建,不光是在堆空间中创建一块区域,它还会在字符串池中创建一个对象。 然后由栈空间的指针指向他们。
gaofuqi 2014-08-12
  • 打赏
  • 举报
回复
看得出楼主有C++的编程基础,对内存分配和对象的内存布局应该能很好的理解。其实Java的内存分配和布局都是Java虚拟机实现的,没有一定的规则或规范,不同的Java虚拟机有不同的实现,有个大概清晰的概念即可。
加载更多回复(23)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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