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