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

猜你喜欢

转载自blog.csdn.net/rookiegan/article/details/82427224