Thinking:int,Integer数组的初始化

类别:Java 点击:0 评论:0 推荐:

EXAMPLE ArrayOne :

import java.util.*;
public class ArrayOne{
static Random rand = new Random();
static int pRand(int mod) {
return Math.abs(rand.nextInt()) % mod + 1;
}
public static void main(String[] args) {
int[] a;
a = new int[pRand(20)];
prt("length of a = " + a.length);
for(int i = 0; i < a.length; i++)
prt("a[" + i + "] = " + a[i]);
}
static void prt(String s) {
System.out.println(s);
}
}

My Tip:从程序输出可看到基本数据类型的数组元素会自动初始化成“空”值(对于数值,空值就是零;对于char,它是null ;而对于boolean,它却是false)

==============

EXAMPLE ArrayTwo:

public class ArrayClassObj {
??????? public static void main(String[] args) {
??Integer[] a = new Integer[20];
??prt("length of a = " + a.length);
??for(int i = 0; i < a.length; i++) {
??a[i] = new Integer(i);/**将该句注释后,执行没有错误!!!*/
??prt("a[" + i + "] = " + a[i]);
????????? }
?}
?static void prt(String s) {
??System.out.println(s);
?}
}

My Tip:

ThinkingInJava 2 叙述如下:

若操作的是一个非基本类型对象的数组,那么无论如何都要使用new。在这里,我们会再一次遇到句柄问
题,因为我们创建的是一个句柄数组。请大家观察封装器类型Integer,它是一个类,而非基本数据类型

Integer[] a = new Integer[20]中,甚至在new 调用后才开始创建数组,它只是一个句柄数组,而且除非通过创建一个新的Integer 对象,从而初始化了对象句柄,否则初始化进程不会结束,所以a[i] = new Integer(i),但若忘记创建对象,就会在运行期试图读取空数组位置时获得一个“违例”错误。

===

注意,在这里,当我注释掉a[i] = new Integer(i);这句时,仍然可以运行,运行结果是,a[0]~a[19]均为null

理解(1):

Integer[] a = new Integer[20];
就已经对数组进行初始化了,数组里的每个元素的值都为null,a是一个数组对象,已经生成实例了:a = new Integer[20];其元素是Integer对象的引用,按照java规范,其初值为 null,即不指向任何对象
而在int[] a=new int[3];中
数组里的每个元素都是0;

理解(2):

屏蔽掉
a[i] = new Integer(i);
仍然能执行的原因是下面的这句语句
prt("a[" + i + "] = " + a[i]);
它会把a[i]转换成字符串,然后想加.
由于a[i]=null,而null这个特殊的东西转换成的字符串也是"null",所以你的程序的输出必然是
a[0] = null
a[1] = null
a[2] = null
...
,当然你把prt语句中的a[i]换成null,程序一样的执行结果.

但是这并不是说你的数组就初始化结束了,这个时候数组仍然没有被初始化,他的每个值都是null,即不可用的.这个时候调用a[i].任何方法都会出异常.
比如你把prt这句该为
prt("a[" + i + "] = " + a[i].toString());/**改后抛出异常,因为基本数据类型中toString()已经重写,而非基本类型要自己写,此处会传地址值,但因为a[i]为null,所以异常,具体可看此笔记第二篇*/

还有想看看效果,可以把上句该为
prt("a[" + i + "] = " + new Object());
他输出的是Object.toString()转换出来的地址.
所以

只有在「生成新的Integer 物件以初始化reference」之後,初始化動作才算完成:

这句话是正确的.只有这样才能使用a[i],否则可能就只能象prt 这样的程序可以执行,其他的恐怕还会出错.能运行的原因当然是因为那个null了.而不是说a[i]是可用的.

本文地址:http://com.8s8s.com/it/it16158.htm