以题目引入:
面试题:int[] a = new int[10];Student[] a = new Student[10];的区别?
解析:
第一反应就是内存空间方面的保存位置不同,因为Java中保存基本数据类型的位置是在栈区,引用数据变量是在堆区,栈区保存的只是引用(引用就是只保存地址的位置的)。
但是关键的地方还没有解释清楚,其实就是解释的主要就是基础变量和引用变量在数组开辟空间方面的不同之处。
以一个部分代码作为引申学习:
Student[][] s = new Student[10][];
for(int i=0;i<s.length;i++){
for(int j=0;j<s[i].length;j++){
}
}
问题是:该代码是否能够编译运行?
答案是:错误,原因是s只是开辟了10行的Student一维数组,但是对于每一个一维数组并没有声明实际空间的大小,所以它仅仅是一个对象引用,相当于Student[] s;无法获得他的长度。故而报NullPoint的问题。
如果还是存在问题,我们以一个部分代码进行说明:
Student[] s = new Student[10];
for(int i=0;i<s.length;i++){
System.out.println(s[i].name);
}
问题是:该代码是否能够编译运行呢?
答案是:错误,原因在上面已经讲述了,故此不在版署了。
在此大家差不多就明白了面试题想考的问题方面在哪里了。没错,就是在引用数组new操作的对象之后,我们要对于每一个引用对象进行实际的在此new。
正确代码:
Student[] s = new Student[10];
for(int i=0;i<s.length;s++){
s[i] = new Student("张三",i);///Student中存在构造方法Student(String name,int id)
System.out.println(s[i].name+" "+s[i].id);
}
Student[][] s = new Student[10][];
for(int i=0;i<s.length;i++){
s[i] = new Student[10];
for(int j=0;j<s[i].length;j++){
s[i][J] = new Student("张三",i);///此处Student存在一个构造方法Student(String name,int id)
}
}
到此,该面试题差不多就解析完全了。
总结:
基础数据类型数组,可以直接通过数组名+id访问,不存在NullPoint问题,存在的只是越界问题。
引用数据类型数组,也可以直接通过数组名+id访问,但是之前在声明的时候,必须一个一个的进行实例化。否则就会出现空指向问题。(主要针对对象类型的数组,除String等以外的)
第一点:String是引用数据类型,但是String数组存在null的初值,不需要每一个new一下。不存在会为null值(String[] s = new String[10],没有赋值之前全部为null)。
第二点:Object超类除外