请教:
这个小程序中:
import java.util.*;public class ArraysClassObj
{
 public static void main(String[]args)
 {
  Random rand = new Random(47);
  Integer[]a = new Integer[rand.nextInt(20)];
  System.out.println("length of a = "+a.length);
  for(int i=0;i<a.length;i++)
  {
   a[i] = rand.nextInt(500);
   System.out.println(Arrays.toString(a));
  }
 }
}
再看这样一段话:
这里 即便使用new创建数组以后:
Integer[]a = new Integer[rand.nextInt(20)];
它还只是一个引用数组 (1)并且直到通过创建新的Integer对象(在本例中是通过自动包装机制创建的) 并把对象赋值给引用 初始化进程才算结束:
a[i] = rand.nextInt(500);
(2)如果忘记了创建对象 并且试图使用数组中的空引用 就会在运行时产生异常请问:
1,根据这一段话 创建一个对象数组时 如:Integer[]a = new Integer[rand.nextInt(20)];  难道a没有指向new Integer[rand.nextInt(20)]吗 要等给a的成员赋值后才将new Integer[rand.nextInt(20)]的地址赋给a吗
2,请教(1)(2)句解释一下 真的完全看不懂

解决方案 »

  1.   

    1.Integer[] a = new Integer[rand.nextInt(20)];创建了一个引用,并分配好了一个地址和空间大小,但数组中各个对象并未初始化,也就是未知对象,但编译器将初始其为0
    2.(1)没什么问题吧
    (2)他的意思是每个a[i]都需要创建,刚开始只是创建了一个数组,还需要为数组中每个元素初始化
    就是a[i] = new Integer(1);这样
      

  2.   

    API 里写的很详细啊
    public Random(long seed)使用单个 long 种子创建一个新随机数生成器: 
     public Random(long seed) { setSeed(seed); }next 方法使用它来保存随机数生成器的状态。 参数:
    seed - 初始种子。  Random rand = new Random(47); //用于生成随机数序列public int nextInt(int n)返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。nextInt 的常规协定是伪随机地生成并返回指定范围中的一个 int 值。所有 n 个可能 int 值的生成概率(大致)相同。Random 类按如下方式实现 nextInt(int n) 方法: 
     public int nextInt(int n) {
         if (n<=0)
                    throw new IllegalArgumentException("n must be positive");     if ((n & -n) == n)  // i.e., n is a power of 2
             return (int)((n * (long)next(31)) >> 31);     int bits, val;
         do {
             bits = next(31);
             val = bits % n;
         } while(bits - val + (n-1) < 0);
         return val;
     }
     前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 int 值。 但此算法稍微有些复杂。它拒绝那些会导致不均匀分布的值(由于 2^31 无法被 n 整除)。某个值被拒绝的概率取决于 n。最坏的情况是 n=2^30+1,拒绝的概率是 1/2,循环终止前的预计迭代次数是 2。 此算法特别对待 n 是 2 次幂的情况:它从基础的伪随机数生成器中返回正确的高位数。在不是特殊处理的情况中,将返回正确的低 位数。众所周知,线性同余伪随机数生成器(比如此类所实现的)在其低位的值序列中有 short periods。因此,如果 n 是 2 次幂(幂值较小),则这种特殊情况会导致对此方法的后续调用会返回其长度大大增加的值序列。 
    参数:
    n - 所返回随机数的范围。必须为正数。 
    返回:
    一个伪随机数,处于 0(包括)和 n(包括)之间均匀分布的 int 值。 Integer[]a = new Integer[1,2,3,34]; //可以看懂吧,数组定义
    Integer[]a = new Integer[rand.nextInt(20)];   //根据上边关于nextInt(int n)可以看出来,
              //是用于把第一行生成随机数序列中大于0,小于20的数字放到数组中
      

  3.   

    是你自己读的时候标点打错了吧,呵呵
    再看这样一段话: 
    这里 即便使用new创建数组以后: 
    Integer[]a = new Integer[rand.nextInt(20)]; 
    它还只是一个引用数组 
    这里只是创建了一个数组对象,但是并没有初始化它
    (1)并且直到通过创建新的Integer对象(在本例中是通过自动包装机制创建的) 并把对象赋值给引用 初始化进程才算结束: 
    a[i] = rand.nextInt(500); 这里告诉你如何初始化数组对象(2)如果忘记了创建对象 并且试图使用数组中的空引用 就会在运行时产生异常 

    这里告诉你,如果像下面这样的使用会出错
    Integer[]a = null;
    a[0] = 0;

      

  4.   

    Integer[]a = new Integer[rand.nextInt(20)]; 就好象声明了一组  Integer a=null;
      

  5.   

    你要明白一点:就是数组也是对象.
    Random rand = new Random(47); 
      Integer[] a = new Integer[rand.nextInt(20)]; 
    执行到这以后,内存中已经分配了空间,引用a 以指向这块内存空间,假如说rand.nextInt(20)返回的是3,那么就相当于这样:
    Integer[] a=new Integer[3]{null,null,null};(上面有人好象说错了,对象类型在创建数组时初始化为null).
    打印结果可看到System.out.println(a[0]);
    所以说到此对象以创建完成.
    而且你可以这样理解数组中的每个元素:
    我们在创建一个类的对象时,如果我们没有为成员变量初始化,那么成员变量默认为null(这是指对象类型)数组也可以这样理解----数组中的元素就相当于对象中的成员变量一样.再说下一点,抛异常指的是:
    你调用了null,对null进行方法调用,如a[0].toString();此时a[0]是null,所以会报空指针
      

  6.   

    坚决反对4数的说法:
    坚决反对4数的说法:
    坚决反对4数的说法:
    坚决反对4数的说法:
    坚决反对4数的说法:
    坚决反对4数的说法:Integer[]a = new Integer[rand.nextInt(20)];
    执行完这一步,你就可以执行a.length,
    null有length属性吗
      

  7.   

    1,根据这一段话 创建一个对象数组时 如:Integer[]a = new Integer[rand.nextInt(20)];  难道a没有指向new Integer[rand.nextInt(20)]吗 要等给a的成员赋值后才将new Integer[rand.nextInt(20)]的地址赋给a吗 答:
    Integer[]a = new Integer[rand.nextInt(20)];  创建的是一个数组,存放的是引用,有地址,没有对象,没有赋值
    要对这个数组的每个引用分别赋值,也就是new Integer[rand.nextInt(20)]
      

  8.   

    java中,数组是一个对象。
    new Integer[rand.nextInt(20)];  这个语句创建了一个对象。
    所以 Integer[]a = new Integer[rand.nextInt(20)]; 这个之后,a 就可以查询 a.length 了。
    但是,此时,a 里面的各个对象都是 null(比如a[0]是null,a[1]是null),并不是楼上所说的 a = null,也不是 自动初始化 为 0,a里面的各个对象都是null,因为这里 a 是 Integer 数组,Integer是对象,它的自动化默认值是 null。(1)并且直到通过创建新的Integer对象(在本例中是通过自动包装机制创建的) 并把对象赋值给引用 初始化进程才算结束:
    Integer[]a = new Integer[rand.nextInt(20)]; //这个语句之后,数组 a 就初始化结束了。
    a[i] = rand.nextInt(500);//这个语句之后,a[i]就初始化结束了,否则 a[i] 等于 null(2)如果忘记了创建对象 并且试图使用数组中的空引用 就会在运行时产生异常
    加入只有这样一行:Integer[]a = new Integer[5]; 
    然后 使用 a[0].intValue() ,那么就会跑出运行时 NullPointer 异常。 
      

  9.   

    int[] a = new int[3];
    这个语句就不一样,a里面的各个元素就会被自动初始化为0。
      

  10.   

    int[] a = new int[3]; 
    这个语句就不一样,a里面的各个元素就会被自动初始化为0。基本类型
    Integer a[] = new Integer[3];包装类型,每个为null.
      

  11.   

      // 动态生成了一个长度随机的数组,并分配了空间,但里面的内容为null,既没有初始化
      Integer[]a = new Integer[rand.nextInt(20)];
      // 显示分配长度
      System.out.println("length of a = "+a.length);
      // 循环初始化
      for(int i=0;i <a.length;i++)
      {
       // 初始化每个对象为随机数
       a[i] = rand.nextInt(500);
       // 
       System.out.println(Arrays.toString(a));
      }
     } 仅供参考。
    Integer[] a1;
    Integer[] a2 = new Integer[10];
    Integer[] a3 = new Integer[]{1,2,3,4,5,6,7,8,9,10};请注意他们的区别