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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘_浩 中级黑马   /  2012-3-12 11:16  /  1498 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前面提到数组,用new出来的数组是在堆内存中开辟的实体,但是有这样的一种写法:int[] x={3,1,6,5,4}这也是正确的。请问也是开辟的实体吗?它没有用new。

4 个回复

倒序浏览
本帖最后由 赵英坤 于 2012-3-12 11:27 编辑

是存在堆中的

数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

所以x是在栈中,而实际的存储是在堆中的
回复 使用道具 举报
我这儿有详细的总结的关于数组的资料,希望你能用到:


数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。注意:如果你熟悉C/C++,请注意, Java数组的工作原理与它们不同。

1、数组不是集合,它只能保存同种类型的多个原始类型或者对象的引用。数组保存的仅仅是对象的引用,而不是对象本身。

2、数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

3、数组声明的两种形式:一、int[] arr; 二、int arr[];  推荐使用前者,这符合Sun的命名规范,而且容易了解到关键点,这是一个int数组对象,而不是一个int原始类型。

4、在数组声明中包含数组长度永远是不合法的!如:int[5] arr; 。因为,声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。

5、在数组构造的时候必须指定长度,因为JVM要知道需要在堆上分配多少空间。反例:int[] arr = new int[];

6、多维数组的声明。int[][][] arr; 是三维int型数组。

7、一维数组的构造。形如:String[] sa = new String[5]; 或者分成两句:String[] sa;  sa = new String[5];

8、原始类型数组元素的默认值。对于原始类型数组,在用new构造完成而没有初始化时,JVM自动对其进行初始化。默认值:byte、short、 int、long--0  float--0.0f double--0.0  boolean--false  char--'"u0000'。(无论该数组是成员变量还是局部变量)

9、对象类型数组中的引用被默认初始化为null。如:Car[] myCar = new Car[10]; 相当于从myCar[0]到myCar[9]都这样被自动初始化为myCar[i] = null;

10、对象类型的数组虽然被默认初始化了,但是并没有调用其构造函数。也就是说:Car[] myCar = new Car[10];只创建了一个myCar数组对象!并没有创建Car对象的任何实例!

11、多维数组的构造。float[][] ratings = new float[9][]; 第一维的长度必须给出,其余的可以不写,因为JVM只需要知道赋给变量ratings的对象的长度。
回复 使用道具 举报
数组的定义就是同一种类型数据的集合,数组就是一个容器。
格式:元素类型[] 数组名=new 元素类型(元素个数或数组长度);int[] num=new int(3); x[0]=59;new 是用来在内存中产生一个容器内存实体。数组是一个引用数据类型

      元素类型[] 数组名= (new 元素类型[] ){元素1,元素2}这是一种静态初始化方式一样在堆内存中开辟实体并且附上了初始值。
堆:凡是new出来的实体都在堆中,堆内存中的实体都是有默认的初始化值,堆有地址值。当一个实体在堆中没有任何引用的话,这个会在虚拟机的程序的自动清除。会在不定时的时候清除他
回复 使用道具 举报
当然了 其实你的那种方法等价于  int[] x=new  int [] {3,1,6,5,4},  int[] x={3,1,6,5,4}这种写法只不过是它的简写形式,其实也是开辟的实体。
你这里x就是一个引用,该引用指向了堆内存中的数组的地址。
另外:数组中存放的也是对象哇,所以也是声明的时候是需要使用到new的,但是int[] x={3,1,6,5,4}是简写,所以new就省略了。希望能帮到你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马