在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");}}}
