- 作者:xiaoxiao
- 发表时间:2020-12-23 10:39
- 来源:未知
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):