2011-03-27 52 views
2

嗨我有一個基本的疑問,當我分析對象和引用時。帶有對象和引用的java數組

int a; //here we are creating an object a of type integer 

Integer b=new Integer(); // here we are creating a reference variable b points to an object of type Integer in heap. 

每一個的優點是什麼?在哪裏使用「int a」而另一個?

在陣列的情況下,

int[] a=new int a[5]; 

如果 「INT a」 是可能的,爲什麼 「INT一個[5]」 是不可能的,因爲下面的代碼拋出零指示字例外,

int a[5]; 
a[0]=10;  
System.out.println(a[0]); //gives null pointer exception 

代碼效果很好,當

int[] a=new int[5]; 
a[0]=5; 
System.out.println(a[0]); 

爲什麼在情況下,前一種情況除外它的參考需要創建當「int a」有效時?

回答

1

int a正在聲明一個原始變量,稱爲a,其類型爲int。基元不是對象,而是基元的數組是對象。

數組是對象,但它們是特殊類型的對象,Java有特殊的語法可供使用。當您使用int[] a時,您正在聲明一個名爲a的對象,其類型是一個int數組。當您使用a = new int[5]進行賦值時,就好像您在以特殊方式調用構造函數一樣。這就好像你真的在調用一些構造函數並將大小作爲參數傳遞給它:a = new IntArray(5)或其他東西。 Java爲您提供了特殊的語法,因此不需要此類構造。

同樣,當你說a[0] = 5時,就好像你正在調用對象a的方法,但是Java爲你提供了特殊的語法。這幾乎就像你打電話給a.setValue(0, 5)一樣,但是Java提供了很好的語法,所以這種類型的事情也不是必需的。

所以,如果你試圖聲明int a[5],那就像試圖用new IntArray(5)來聲明一個變量......這是沒有意義的變量聲明。你基本上會使用對構造函數的調用來聲明一個變量,這沒有多大意義。

1

這是因爲int不是Object - 它是原始類型,它不能爲null。 整數是對象,引用可以爲空。

int a[] = new int[5]; //is legal and all elements has 0 
Integer a[] = new Integer[5]; //is legal too but in this case you have null 

使用整數的常見的情況是類別,在這種情況下它必須是對象,e.g:

List<int> list = new ArrayList<int>   // Illegal 
List<Integer> list = new ArrayList<Integer> // OK 
0

int是原始類型Integer用途。 int效率更高,因爲Integer是一個帶方法的類,因此使用更多的內存。

第一個數組示例不起作用,因爲僅僅使用int a[5];您只是創建一個引用,而不是實際值(因此當您嘗試使用它時會拋出NullPointerException)。使用int[] a=new int[5];您可以創建要使用的實際數組,因此在此之後您可以使用這些值。

0

a)首先,int a;不聲明對象。它只是一個var來保存一個整數。

b)始終在包裝類上使用原始數據類型以避免創建僅用於表示原語的對象的開銷。

C)int a[5]是至5點的整數指向null的數組的引用,因此a[0]是沒有意義的

d)代碼int[] a = new int[5];工作正常,因爲你已經初始化a〜5點的整數的陣列,每個其中默認值爲0.

e)int a是一種原始數據類型聲明,因此它不一定需要初始化,除非它是局部變量。然而,int[] a是一個int數組引用,並且由於數組是Java中的對象,因此在使用它們之前必須進行初始化。

0

int a[5];可以隱含地理解爲 int a[5] = null; (聲明在java中是無效的)。 int[] a=new int[5];創建長度爲5的數組,陣列的每個元素包含默認值0Integer[] a = new Integer[5]創建長度爲5的Integer的數組,所有元素都有null作爲默認值。

有辦法初始化一個數組(只是一個額外的注意事項)。例如:

int a[] = {1, 2, 3, 4, 5}; 

這產生的長度爲5的int的陣列,並且每個元素(從0開始計數)由從左側到右側開始括號{}分配的值。

此外,int是原始類型,所以JVM創建的int(例如,4個字節INT)而IntegerObject所以JVM創建內存空間來容納的Integer完整的對象的大小的存儲器空間(這是大於int的存儲空間)。

哪裏要用「int a」和另一個

使用Integer,如果你需要使用泛型(因爲你不能在仿製藥使用基本類型,但int[]或原始陣列允許)或者需要Integer類的功能。否則,將值存儲到持久存儲中,請使用int

+0

我覺得'int a [5];'是Java中的語法錯誤,以及'int a [5] = null;'會是。請參閱[JLS第8.3節](http://java.sun.com/docs/books/jls/third_edition/html/classes.html#40898),括號內沒有任何內容。 – 2011-03-27 22:15:50

+0

@PaŭloEbermann,很好的觀察。謝謝 – 2011-03-27 23:46:24