Java基礎學習之引用型別陣列訪問NullPoint問題
阿新 • • 發佈:2018-11-21
以題目引入:
面試題: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超類除外