A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ciying88 中级黑马   /  2017-3-15 21:56  /  629 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

有一个自定义类:
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();
}





首先了解一下对象的内存布局,(以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是在栈中;

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马