[英]How array of primitive types work in Java?
在java中,據說“除了原始類型之外的所有實例化都是一個對象。”
我試圖使用下面的代碼來理解這一點(第4行是具體的)。
public class dummy{
public static void main(String[] args){
int[] i = new int[2];
i[0] = new Integer(3); //line 4
i[1] = 3;
System.out.println(int[].class);
System.out.println(i[0]);
}
}
跑完之后
int[] i = new int[4];
Java正在創建類型為class [I
[0,0]
的對象[0,0]
。 此對象[0,0]
中的兩個成員是原始數據類型(但不是引用類型)。
我的問題:
為什么Java允許將對象分配給基本類型成員,如下所示?
i[0] = new Integer(3); // object of type 'class Integer' getting assigned to i[0]
我怎么理解這個? 在計數器中, i[0]
顯示值3
但不顯示對象地址。
I
在class [I
是什么時候class [I
? 我的意思是,對於class C{};
, C[].class
給出class [LC
其中[
表示“數組”和LC
表示“實例'類C'”
i[0] = new Integer(3);
這涉及所謂的自動拆箱 。 在Java的黑暗時代(1.5之前版本),我們過去必須明確地選擇基本類型和拆箱原型。 但幸運的是語言設計師對我們可憐的手指表示同情,並添加了一些語法糖。 它們現在讓我們在原語和它們的包裝類型之間自由轉換。 Java秘密地將上面的代碼轉換成:
i[0] = new Integer(3).intValue();
這是自動拆箱。 同樣,它會為您提供價值,而無需您提出要求。 如果你寫:
Integer i = 5;
Java實際上會執行:
Integer i = Integer.valueOf(5);
我在
class [I
是什么時候class [I
?
那是I
的int
。
int
分配給數組的元素,但是您傳遞Integer
,因此它會自動取消裝箱為int
。 順便說一句,當你創建一個Integer[]
數組時,你在執行System.out.println
時也會得到相同的結果,因為Integer.toString
只是創建它的值的字符串,而不是“對象地址”。 [
表示一維數組。 I
意思是int
。 java/lang/Integer.intValue:()I
當你執行i[0] = new Integer(3); //line 4
時, java/lang/Integer.intValue:()I
被調用i[0] = new Integer(3); //line 4
i[0] = new Integer(3); //line 4
ie,編譯器隱式獲取Integer的int值並將其添加到數組中。
對於您的第一個問題,Java autoboxes原始類型及其包裝類(例如,int被包裝到Integer類中),並且還取消了原始類型的包裝器。
這是文檔: http : //docs.oracle.com/javase/tutorial/java/data/autoboxing.html
編譯器執行基元與其對應對象之間的轉換,以方便程序員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.