该文为《疯狂java 突破程序员基本功的16课》读书纪要。
public void testArrays() throws Exception {
String[] books = new String[] { "java", "asp", "php", ".net" };
String[] names = new String[] { "张三", "李四", "王五", "赵老六" };
String[] ages = new String[] { "和尚", "尼姑" };
names = books;
books = ages;
Assert.assertEquals(names[0], "java");
Assert.assertEquals(books[0], "和尚");
Assert.assertEquals(books.length, 2);
Assert.assertEquals(names.length, 4);
Assert.assertEquals(ages.length, 2);
// 声明而不初始化数组
String[] newAges;
newAges = books;
Assert.assertEquals(newAges[0], "和尚");
Assert.assertEquals(newAges.length, 2);
}
可得出以下几点:
1. 将数组B指向数组A,则无论B是如何初始化或者声明的,B的长度和值均与A相同,即B指向了A的内在空间;
2. 将数据B指向数据A,再将数据A指向数组C,则B指向的还是A的内存,与C无关;
3. 可仅声明而不初始化一个数组:声明数组,然后将该数组指向另一已经初始化的数组。
对于Java程序中所有的引用变量,它们都不需要经过所谓的初始化操作,需要进行初始化操作的是该引用变量所引用的对象。比如,数组变量不需要进行初始化操作,而数组对象本身需要进行初始化;对象的引用变量也不需要进行初始化,而对象本身才需要进行初始化。
数据执行动态初始化(指定长度而不指定值)时,系统将负责为每个数组元素分配初始值。指定初始值时,系统将按如下规则分配:
1. byte、short、int和long,初始值是0;
2. float、double,初始值是0.0;
3. char,初始值是'\u0000';
4. boolean,初始值是false;
5. 其他类型,初始值是null;
所有局部变量都是放在栈内存中保存的,不管其是基本类型的变量,还是引用类型的变量,都是存储在各自的方法栈区中;但引用类型变量所引用的对象(包括数组、普通Java对象)则总是存储在堆内存中。