中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > Web开发 > JavaScripts > 综合文章
Thinking:int,Integer数组的初始化
作者:佚名 时间:2005-03-16 11:03 出处:互连网 责编:chinaitpower
              摘要:Thinking:int,Integer数组的初始化

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]是可用的.

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有