THINK IN JAVA里面写到
“特别是对象引用的都放到堆栈里面”
而NEW出来的放在堆里面
但是,当我们申请数组时,为引用数组
那应该放到堆栈里面
可是数组是NEW出来的啊,不是矛盾么
className[] a=new className[5];
这个a[0]是个引用,存放到哪里呢??

解决方案 »

  1.   

    是啊
    但是 
    我问a[0]应该在那里呢?
    他是NEW出来的吧?
    他是引用吧?
      

  2.   

    a是引用,对象是new className[5];
    引用指向对象,引用存放在栈,对象在堆中.
      

  3.   

    参考《JAVA 2核心技术 1》 的 对象和对象变量 这节。
    你就清楚一些了。
      

  4.   

    a[0]在栈里阿
    new出来的是a指向的内存区域,和a[0]没有关系阿~现在a[0]是null,在栈中。
    a[0]= new className();之后a[0]所指的对象在堆中。
    没有矛盾
      

  5.   

    对此有疑问的请去看SCJP的官方教材,对对象的存储有非常详细的解释。
      

  6.   

    "对象的值" 和"对象的内容" 是两个不同的概念;
    className[] a=new className[5];
    a[0]是"对象的值"即"对象的引用",它的值是一个地址(指向一个内存空间(在这个内存中存放了对象的内容));
    又因为引用存放在栈中,对象存放在堆中;
    所以a[0]存放在栈中,而a[0]所指向的对象存放在堆中;
      

  7.   

    是的
    说的我也知道
    但是想这里
    a[0]是NEW出来的吧
    应该在堆里
    a[0]是引用吧
    应该在堆栈里
    那么a[0]到底在哪??-----------------------------
    Dan1980  引用不在堆栈里么??
    a[]不是引用数组么
      

  8.   

    是的
    说的我也知道
    但是想这里
    a[0]是NEW出来的吧
    应该在堆里
    a[0]是引用吧
    应该在堆栈里
    那么a[0]到底在哪??-----------------------------
    a[0]中的内容是new出来的
    a[0]是一个引用,它保存指向其内容的地址
    我们通常说的a[0]的值是说a[0]中指向的地址中的值.所以a[0]是引用,在堆栈里,
    a[0]的值在堆里
      

  9.   

    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].......
      

  10.   

    楼上说的很明白..
    如果
    int[] a = new int[10];System.out.println(a);//得到的会是一个地址..
      

  11.   

    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 或用静态数组)不然回出现数组越界错误!
      

  12.   

    楼主的数组问题a[0]显然是放在堆中的,
    而且不是所有的引用都是在栈里面的例如实例变量
    class A
    {
      Object o;
    }
    如果A a=new A();这个时候a是放在栈里面的,然而实例变量o是放在堆中的。
    scjp的官方教程写的很清楚,准确的讲实例变量和new出来的是放在堆中,局部变量是放在栈中的。
      

  13.   

    className[] a;  //是一个引用,初始值为null
    new className[2];//是一个实例,这两行没有联系,className[] a = new className[2]; //引用指向了实例,即a的值为实例的地址
      

  14.   

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