簡體   English   中英

Java中原始類型的數組如何工作?

[英]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]中的兩個成員是原始數據類型(但不是引用類型)。

我的問題:

  1. 為什么Java允許將對象分配給基本類型成員,如下所示?

     i[0] = new Integer(3); // object of type 'class Integer' getting assigned to i[0] 

    我怎么理解這個? 在計數器中, i[0]顯示值3但不顯示對象地址。

  2. Iclass [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

那是Iint

  1. Java期望您將int分配給數組的元素,但是您傳遞Integer ,因此它會自動取消裝箱int 順便說一句,當你創建一個Integer[]數組時,你在執行System.out.println時也會得到相同的結果,因為Integer.toString只是創建它的值的字符串,而不是“對象地址”。
  2. [表示一維數組。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM