老师说成员变量存放在栈内存里面,new出来的东西存放在堆内存里面。比如类A中的成员变量int i; 这个i是存放在栈内存里面吗?
那A a = new A();这个new A()是在堆内存里面,a.i也是在堆内存里面呢?那么int i到底是在堆内存里面还是在栈内存里面呢?

解决方案 »

  1.   

    看上下文。
    比如
    void f(){
       int i;//这个i在函数被调用时在栈中分配空间
    }class A{
       int i;
    }
    new A();创建对象的时候分配在堆里。打个比方,张三在堆里坐着,那张三的脑袋当然也在堆里了。
      

  2.   

    http://blog.sina.com.cn/s/blog_5d7cccb90100bv5u.html
      

  3.   

    内存分配方式有三种:
    (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
    (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
         栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
    (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
         动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
      

  4.   


    当对象没有被实例化之前,类A的成员变量int i分配在堆还是栈里面呢?
    是不是在对象没有被实例化之前类的成员变量在栈内存上分配空间;而实例化对象之后成员变量就被分配到了堆空间中呢?
    比如您所说的:[Quote=引用
    class A{
      int i;
    }
    new A();创建对象的时候分配在堆里。打个比方,张三在堆里坐着,那张三的脑袋当然也在堆里了。
    [/Quote]
    如果没有new A();int i会被分配到堆还是栈呢?
      

  5.   

    new出来的东西是放在堆内存里 像a,i的变量放在栈内存里
      

  6.   


    你所说的是一个变量的引用,那如果成员变量在定义的时候就给它赋了值,比如int i = 1;在实例化这个类的对象之前,int i = 1被分配到哪个内存里面?
      

  7.   


    在这里看懂了,谢谢!
    不过面文章里下的又不懂了:
    Strings tr1=new String(“abc”);
    Strings tr2=“abc”;
    tr1和tr2指向的不是同一个对象吗?它们的内存又是怎么分配的呢?
    tr1在栈里面有一分内存,然后tr1的值"abc"分配在堆内存里rt1所引用的对象中,tr1指向"abc".
    tr2在栈里面有一分内存,然后tr2的值就直接存在于栈内存中吗?还是tr2在堆中创建了另一个对象来存储"abc"?所以tr1 == tr2 为false? 可是tr2没有new啊?里面的看不太懂!
      

  8.   


    它在运行的时候才会被分配空间,没有运行的时候它就是一个class文件。所以说,实例化之前,它存在硬盘上,而不是内存里。
      

  9.   


    可以看看我的博客《String in Java
      

  10.   

    谢谢楼上的大侠!
    同时更正一下:成员变量在运行时被分配在堆内存里面,因为成员变量是在new出对象的时候才运行的!是我听课时听错了,谢谢大家的热情!