-
问题引出:
- 在java中,声明一个数组的过程中,是如果分配内存的。
“em… …” - 那,Java数组的初始化一共有几种方式,你能说一说吗?
“em… …” - 那你知道基本类型数组 和 引用类型数组之间,在初始化时的内存分配机制有什么区别吗?
“em… …”
- 在java中,声明一个数组的过程中,是如果分配内存的。
希望看过问题的小伙伴先在评论区留下你的 答案!
-
Java语言是典型的静态语言,因此Java的数组是静态的,
即数组被初始化之后,该数组的长度是不可变的。
Java程序中的数组必须经过初始化才可使用。
所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组指定初始值。 -
数组的初始化有以下两种方式。
- 静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度。
- 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。
//静态初始化
String [] str = new String[]{ "碌无为","Java" };
//静态初始化可简写 String [] str = { "碌无为","Java" };
//动态初始化
String [] str2 = new String[2];
str2[0] = "碌无为"; str2[1] = "Java";
注意: 不要同时使用静态初始化和动态初始化。也就是说不要在进行数组初始化时,即指定数组的长度,也为每个数组元素分配初始值。×
String [ ] str = new String [2]{ "碌无为","Java" };
数组一定要初始化吗?
-
大家都应该知道: 使用Java数组之前必须先初始化数组,
也就是为数组元素分配内存空间,并指定初始值。 -
实际上,如果真正掌握了Java数组在内存中分配机制,那么完全可以换一个方式来初始化数组
或者说,数组无需经过初始化。 -
误区点
-
Java的数组变量是引用类型的变量,它并不是数组对象本身,
只是让数组变量指向一个有效的数组对象,程序中即可使用该数组变量。
String [] str = new String[]{ "碌无为","Java" };
String [] str2 = str;
我们常常说使用Java数组之前必须先进行初始化,可是现在 str2 变量却无须初始化,这不是互相矛盾吗?
其实一点都不矛盾。
之所以提出这个问题是,因为大部分时候,我们把数组变量和数组对象搞混了,数组变量只是一个引用变量(有点类似于C语言里的指针),通常存放在栈内存中(也可以被放入堆内存中);而数组对象就是保存在堆内存中的连续内存空间。
对数组执行初始化,其实并不是对数组变量执行初始化,而是要对数组执行初始化。
对于数组变量来说,它并不需要进行所谓的初始化,只是让数组变量指向一个有效的数组对象,程序即可正常使用该数组变量。
对于Java程序中所有的引用变量,它们都不需要经过初始化操作,
需要进行初始化操作的是该引用变量所引用的对象。
基本类型数组的初始化
- 对于基本类型数组而言,数组元素的值直接存在对应的数组元素中,
因此基本类型数组的初始化比较简单:程序直接先为数组分配内存空间,再将数组元素的值存入对应内存里。
基本类型变量的值存储在栈内存中,这句话是完全错的。
正确的来说所有局部变量都是放在栈内存里保存的,不管其是基本类型,还是引用类型的变量,都是存储在各自的方法栈区中;但引用类型变量所引用的对象(包括数组,普通java对象)则总是存储在堆内存中
数组元素作为数组对象的一部分,总是保存在堆内存中,不管它们是基本类型元素,还是引用类型的数组。
-
引用类型变量何时只是栈内存中的变量本身,何时又变为引用实际的Java对象
-
引用变量本质是一个指针,只要程序通过引用变量访问属性,或者通过引用变量来调用方法,该引用变量将会由它所引用的对象代替。