【发布时间】:2010-10-17 07:16:58
【问题描述】:
当我们创建一个类类型的对象时,new 运算符会在运行时分配内存。
说
myclass obj1 = new myclass();
这里myclass() 定义了myclass 的构造器
但是
int arr1[4] = new int[];
new 分配内存,但是int[] 在这里做了什么?
【问题讨论】:
标签: java arrays memory-management
当我们创建一个类类型的对象时,new 运算符会在运行时分配内存。
说
myclass obj1 = new myclass();
这里myclass() 定义了myclass 的构造器
但是
int arr1[4] = new int[];
new 分配内存,但是int[] 在这里做了什么?
【问题讨论】:
标签: java arrays memory-management
New 分配内存,但是 int[] 在这里做了什么?
int[] 部分只是指定新分配的内存应该有什么类型。
但是,由于数组不能动态增长,因此编写 new int[] 没有意义(即使您在声明中指定了 int[4]),您必须像这样编写它
int arr1[] = new int[4];
或者像这样
int arr1[] = {1, 2, 3, 4};
JLS 中的相关部分:
【讨论】:
您的代码:
int arr1[4] = new int[];
不会编译。应该是:
int arr1[] = new int[4];
将[] 放在数组名称之前被认为是一种好的做法,因此您应该这样做:
int[] arr1 = new int[4];
通常一个数组被创建为:
type[] arrayName = new type[size];
上面的[size] 部分指定了要分配的数组的大小。
为什么我们在创建数组时使用
new?
因为 Java 中的数组是对象。上例中数组arrayName 的名称不是实际的数组,只是一个参考。 new 运算符在堆上创建数组并返回对新创建的数组对象的引用,然后将其分配给arrayName。
【讨论】:
int 和[] 之间加空格。
上面的程序用下面这行代码声明了一个数组:
int[] anArray; // 声明一个整数数组
与其他类型变量的声明一样,数组声明有两个组成部分:数组类型和数组名称。 数组的类型写为type[],其中type是所包含元素的数据类型;方括号是特殊符号,表示此变量包含一个数组。 数组的大小不是其类型的一部分(这就是方括号为空的原因)。与其他类型的变量一样,声明实际上并没有创建一个数组——它只是告诉编译器这个变量将保存一个指定类型的数组。
【讨论】:
创建对象的一个实例。 new 在heap 上分配内存。 int arr1[4]=new int[]; 在堆上分配 14 个字节。
int数组的正确声明如下:
int[] arr = new int[] {1,2,3}; // legal, array of size 3
int[] a = new int[100]; // Declare and allocate, array of size 100
【讨论】:
int arr1[4]=new int[]; 不会编译,所以它不会在堆上分配任何字节;)
int[] a=new int[5];
a 是数组名,例如声明一个变量'a'-----> int a;
数组 int[] a 的方法相同,其中 [] 表示仅声明数组 diff 是 []现在来新的
new 是一个运算符,这个运算符的作用是什么?
这个新运算符进入堆内存并分配一个数组(由于 int[])并在数组类型 int(由于 int[5])内分配 5 个值调用引用变量。这里引用变量是数组名,即 a。
在堆中创建的任何数组都被赋予引用变量 a
memory diagram
---------------------
| in heap memory |
| |
||------------------ |
|| | | | | | |
|------------------- |
/ ---------------------
/
/
a/
5 个位置为上例中的int[5],并且引用变量指向数组内存位置
【讨论】: