Java自定义类数组的使用

在Java语言中初次使用自定义类的数组时,参照C++中的自定义类数组,编写了如下代码

public class Test {
    public static void main(String[] args) {

        Person[] persons = new Person[3];

        persons[0].name = "Rookiegan";
        persons[0].age = 22;

        for(Person p : persons) {
            System.out.println("name:" + p.name);
            System.out.println("age: " + p.age);
        }
    }    

    static class Person {
        String name;
        int age;
    }

从C++的逻辑来看,这段代码似乎没有问题,编译也顺利通过,但在执行的时候在persons[0].name = “Rookiegan”;这一句抛出空指针异常,也就是说persons[0]根本没有指向一段真正的内存空间。于是我为Person类添加了自定义的构造函数,输出打印信息。

Person() {
    System.out.println("Person Constructor");
}

测试发现现象与不加一样,这个构造函数根本没有执行。

查阅资料发现,由于Java中引用变量存储在栈中,而真正的对象存储在堆中,Person[] persons = new Person[3];这个语句根本不会为数组的成员分配内存,只是在栈中定义一个Person[]类的引用,该引用应该指向3个Person类的对象。

将程序进行如下更改,编译通过,且执行正常。

public class Test {
    public static void main(String[] args) {

        Person[] persons = new Person[3];

        // 如不使用用以下三行代码,执行到persons[0].name = "Rookiegan"时会报空指针异常
        persons[0] = new Person();
        persons[1] = new Person();
        persons[2] = new Person();

        persons[0].name = "Rookiegan";
        persons[0].age = 22;

        for(Person p : persons) {
            System.out.println("name:" + p.name);
            System.out.println("age: " + p.age);
        }

    }    

    static class Person {
        String name;
        int age;

        Person() {
            System.out.println("Person Constructor");
        }
    }
}

   转载规则


《Java自定义类数组的使用》 rookiegan 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Java的初步理解 Java的初步理解
Java简介Java是一种纯粹的面向对象的程序设计语言,Java程序必须以类的形式存在,类是java程序的最小程序单位,java程序中不允许可执行语句、方法、变量等单独存在,所有的程序必须放在某一个类里面,这个有别于C/C++中的全局变量、
2018-06-29 rookiegan
下一篇 
ARM汇编指令 ARM汇编指令
机器语言在CPU中,通过控制电路中开关的状态可以让对应的电路工作,执行一些运算,每一个电路对应的一定长度(ARM指令长度为32位)的10101的二进制代码,这个代码就是机器语言 汇编语言用助记符代替操作码,用地址符(#、:、%、&、
  目录