在Java中,
如果如下去声明一个数组:int[] a={2,3,4,5};
它没有去调用new操作符,那这个数组是建立在栈中,还是堆中?

解决方案 »

  1.   

    只有内置类型在栈中,byte char int float double等等
      

  2.   

    直接这么说不是很准确,先说明是局部变量还是类里定义的field比较好。
      

  3.   

    java对象都放在堆中,而Java数组也是对象
      

  4.   

     
      
    堆内存用来存放由new创建的对象和数组。   
      
    在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。   
      
    在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。   
      
    引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
      

  5.   

    Java中创建对象的标识符实际上是对象的一个“引用”,如果没有用new关键字创建这个对象,这个引用是不能
    被操作的,而对于“引用”的存储是放在通用RAM中栈内的,但创建的对象Java将其存储到RAM中的堆内。Java数组和C/C++有一个很大的区别就在于: 当创建一个Java数组的引用时,Java会对这个引用自动初始化一个
    特殊值NULL, 也就是自动关联上一个对象。这正是Java追求安全性目标的一个体现,即使你写成int[] a;  Java
    数组也是存储在RAM中的堆内的。对于这个方面的东西,建议看《Thinking in Java》第四版Page 22-24,比较详细。
      

  6.   


    这为老兄,感觉您回答得还欠妥当啊."当创建一个Java数组的引用时,Java会对这个引用自动初始化一个NULL"感觉不对,这个引用是建立在栈里的局部变量,它不会自动初始化的,如果不对它进行初始化,它会报错.
      

  7.   


    是我没有把话说清楚,可能你有一些误解了。
        Java对数组引用自动初始化的是一个特殊值,这个特殊值具有关键字null。一旦编译器看到null后,就知道这个引用还没有指向任何对象,也就是说这个数组引用的自动初始化并没有关联上任何对象(即没有创建对象,此时数组引用是在栈中的)。如果在此时使用这个数组引用,就想你所说的确实会报错。但C/C++就不会报错,而是在数组初始化前访问了内存,这样对程序会造成一些无法预料的问题。这也说明了JAVA对安全性的追求。