淺談Java數組

  Java中的數組是靜態的,一旦初始化後,長度就不會改變。所謂初始化,就是爲數組對象的元素分配內存空間,爲每個數組元素指定初始化值。

  初始化有兩種方式:

  1、靜態初始化:初始化時由我們顯示賦值,由系統決定長度,即我們自己確定每個數組元素是什麼,但是不規定長度。

     String [] students=new String[]
     {
      "西昌","酒泉"
     }
     String [] students=
     {
      "西昌","酒泉"
     }

  2、動態初始化:初始化時我們只負責指定長度,不負責爲數組元素賦值。

     String [] students=new String[3];

  當我們定義一個數組變量時,比如String [] students; students這個數組變量(引用變量)並沒有指向一個有效的內存,直到我們完成了初始化後,students就會像一個指針一樣,指向一個有效的數組對象。實際上初始化,並不是初始化對象的引用變量(students),而是對對象本身進行初始化(此處也就是系統爲數組分配內存空間,將數組元素的值存入對應內存裏)。
這裏寫圖片描述

  對於Java中的所有引用變量,它們都不需要經過所謂初始化操作,需要進行初始化操作的只是該引用變量所對應的對象。引用變量只是棧內存中的變量本身,它的本質是一個指針,只有當引用變量調用方法,或者訪問屬性時,該引用變量纔會由它所引用的對象代替。(補充:所有局部變量都是放在棧內保存,不論是基本類型變量(int a),還是引用類型變量(String [] students)都是存儲在各自棧內;但引用類型變量所引用的對象(包括數組,普通Java對象)則總是存儲在內存中)

    //此時系統不會去訪問students所引用的數組對象
    System.out.println(students);       
    /*此時students訪問了length屬性,所以此刻程
    序自動訪問students所引用的數組對象*/
    System.out.println(students.length);
    System.out.println(students[0]);

  此時我們就可以解釋一個NullPointerException的一種情況了。當我們用引用變量訪問實例屬性,或者調用非靜態方法時,如果該引用變量沒有引用一個對象,程序就會發生空指針異常。

        String []students;
        System.out.println(students.length);
        //會拋出空指針異常

  最後談談多維數組,多位數組的本質其實就是一維數組。如下圖所示:
  <code>這裏寫圖片描述</code>

        //定義並且初始化一個一維數組
        Object[] obj1=new Object[2];
        obj1[1]=new Object[2];
        //將obj[1]的值賦值給obj2
        Object[] obj2=(Object[])obj1[1];   
        //......

  依次類推,定義的一個一維數組中的每個空間放置一個一維數組,然後在放置的一維數組的空間內再放置一維數組,不斷下去這樣其實就是一個多維數組了。就等同於創建如下類似的多維數組:

    Object[] obj=new Objecta[c];

  今天分享就到這裏,希望對大家有所收穫。(原文在我自己博客裏面原文地址

  參考書籍:李剛《瘋狂Java》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章