对象数组

Java里数组类型也和其它编程语言一样,存储有序的元素,而数据元素可以是primitive基本类型的变量,也可是是存放指向对象的引用变量

对于基本类型的变量应该就和正常比较简单的数组相类比,十分简易

比如声明一个int[]类型数组变量

int [] numbers;

创建一个长度为3的数组对象,赋给numbers,其实是引用

numbers = new int[3];

这里其实如果很清楚数组的元素,大小的话,可以直接赋值,而不需要用new来创建

到了这一步需要注意的是,数组的每个元素本身都是primitive基本类型这里是int类型,而数组本身是一个对象,numbers是一个对象引用,指向了三个连续int类型变量,因为是基本类型,因此如果放进该类型变量中的值都可以当做是此类型数组的元素,此时int类型的数组中,每个元素都是一个int,这种情况下和常规的理解基本一致,没啥异议

假如这里的数组里类型并非基本类型,而是对象数组,那么这里数组元素并不是对象本身,而是对象的引用

声明一个Person[]类型数组变量p

Person[] p;

创建长度为3的Person数组对象,赋值给p

p = new Person[3];

注意的一点,p只是指向整个数组的引用,而数组里每个元素都不是primitive类型变量,而是指向对象的引用变量,因此缺少了实实在在的Person对象,丝毫无用,需要创建新的Person对象,赋给每一个数组的元素,也就是让引用来指向它们

        p[0] = new Person();
        p[1] = new Person();
        p[2] = new Person();

这样每个元素都对应引用了相关的对象,就可以来操作对象的方法了

整个过程可以来一个完整简单的

class Person {
    String email;
    void hello(){
        System.out.println("Hello," + email);
    }
}

public class Main {
    public static void main(String[] args) {
        Person[] p;
        p = new Person[3];

        p[0] = new Person();
        p[1] = new Person();
        p[2] = new Person();

        p[0].email = "lihui@maoxiaomeng.com";
        p[1].email = "lilei@maoxiaomeng.com";
        p[2].email = "lihua@maoxiaomeng.com";

        int i = 0;
        while (i < 3) {
            p[i].hello();
            ++i;
        }

        int [] numbers;
        numbers = new int[3];
        int j = 0;
        while (j < 3) {
            numbers[j] = j;
            ++j;
        }
        for(int x:numbers){
            System.out.println("a" + x + ": " + numbers[x]);
        }
    }
}

上半部分是对象数组,p引用了数组对象,每个元素是对象引用,分别引用了Person对象,分别通过引用赋值了email属性,最后调用hello方法输出结果

下半部分是int数组,numbers引用了int数组对象,而由于是基本类型,每个元素的值也就是直接赋值的int值,最后输出int数组的值

我觉得有些地方可以对比C语言里的指向结构体的指针协助理解

发表评论