浅谈Java数组

来源:互联网 发布:线阵音响和矩阵的区别 编辑:程序博客网 时间:2024/06/10 06:41

  Java中的数组是静态的,一旦初始化后,长度就不会改变。所谓初始化,就是为数组对象的元素分配内存空间,为每个数组元素指定初始化值。

  初始化有两种方式:

  1、静态初始化:初始化时由我们显示赋值,由系统决定长度,即我们自己确定每个数组元素是什么,但是不规定长度。

     String [] students=new String[]     {      "西昌","酒泉"     }     String [] students=     {      "西昌","酒泉"     }

  2、动态初始化:初始化时我们只负责指定长度,不负责为数组元素赋值。

     String [] students=new String[3];

  当我们定义一个数组变量时,比如String [] students; students这个数组变量(引用变量)并没有指向一个有效的内存,直到我们完成了初始化后,students就会像一个指针一样,指向一个有效的数组对象。实际上初始化,并不是初始化对象的引用变量(students),而是对对象本身进行初始化(此处也就是系统为数组分配内存空间,将数组元素的值存入对应内存里)。
这里写图片描述

  对于Java中的所有引用变量,它们都不需要经过所谓初始化操作,需要进行初始化操作的只是该引用变量所对应的对象。引用变量只是栈内存中的变量本身,它的本质是一个指针,只有当引用变量调用方法,或者访问属性时,该引用变量才会由它所引用的对象代替。(补充:所有局部变量都是放在栈内保存,不论是基本类型变量(int a),还是引用类型变量(String [] students)都是存储在各自栈内;但引用类型变量所引用的对象(包括数组,普通Java对象)则总是存储在内存中)

    //此时系统不会去访问students所引用的数组对象    System.out.println(students);           /*此时students访问了length属性,所以此刻程    序自动访问students所引用的数组对象*/    System.out.println(students.length);    System.out.println(students[0]);

  此时我们就可以解释一个NullPointerException的一种情况了。当我们用引用变量访问实例属性,或者调用非静态方法时,如果该引用变量没有引用一个对象,程序就会发生空指针异常。

        String []students;        System.out.println(students.length);        //会抛出空指针异常

  最后谈谈多维数组,多位数组的本质其实就是一维数组。如下图所示:
  <code>这里写图片描述</code>

        //定义并且初始化一个一维数组        Object[] obj1=new Object[2];        obj1[1]=new Object[2];        //将obj[1]的值赋值给obj2        Object[] obj2=(Object[])obj1[1];           //......

  依次类推,定义的一个一维数组中的每个空间放置一个一维数组,然后在放置的一维数组的空间内再放置一维数组,不断下去这样其实就是一个多维数组了。就等同于创建如下类似的多维数组:

    Object[] obj=new Objecta[c];

  今天分享就到这里,希望对大家有所收获。(原文在我自己博客里面原文地址)

  参考书籍:李刚《疯狂Java》