数组与内存控制:
数组的初始化:
大家都知道java中的数组是静态的,必须经过初始化才可以使用,经过初始化之后,数组的长度便是不可以修改。
所谓初始化,就是为数组对象的每个元素分配内存空间,并指定相应的初始值。数组的初始化有两种方式。
静态初始化:由程序员显示指定每个数组元素的初始值,由系统决定数组的长度。
例子:
String[] book1 = new String[]
{
"疯狂java讲义",
"疯狂ajax讲义",
"疯狂XML讲义"
};
动态初始化: 由程序员显示指定数组的长度,由系统为数组元素分配初始值。
String[] book2 = new String[4];
由java的内存分配机制我们知道:
所有的局部变量都是存储在栈中的,不管是基本类型变量还是引用型的变量,只是引用类型的变量引用的对象放在堆中。所以,上面两个数组变量其在内存的分配如下:
在初始化数组之后,不管你是用什么方式初始化的,数组的长度就被确定下来了。
然而,我们可以通过:
Book2 = Book1;
System.out.println( book2.length );
却看到book2的长度变成了3. 这只是一种假象,这只是因为book2所引用的对象变成了book1引用的对象了,然而book2之前引用的数组对象的长度并没有改变。
那么数组变量一定要初始化么?
答案是否定的,
String[] book3;
Book3 = book2;
上面的book3 数组变量就没有初始化,而是通过一个数组变量赋值,来使book3指向内存中的一个数组对象。
其实,数组的初始化,并非是初始化数组变量,而是初始化数组变量所指向的数组对象。
对象与内存分配:
实例变量和类变量:
学习java的都知道用static修饰的成员变量就是类变量,否则就是实例变量,那我们来讨论一下其的内存分配吧!
在jvm中一个类就对应一个class对象,因此一个类的一个类变量只需要一个内存空间;但对于实例变量,该类每创建一个对象就要为实例变量分配一块内存空间,换句话说,我们创建了多个对象就要为其实例变量分配多少空间。
下次我们将讲述类变量和实例变量的初始化,类继承的内存分配,还有final关键字的作用!