簡體   English   中英

數組是原始類型還是對象(或其他完全類型)?

[英]Is an array a primitive type or an object (or something else entirely)?

這個問題基本上是不言自明的。 我一直無法找到數組的 API(除了這個Arrays ,但這只是定義了一堆用於處理實際數組的靜態輔助函數)。 如果沒有它的類,這似乎表明數組不能是Object

然而,數組具有像length這樣的公共字段和可以像.equals().clone()這樣調用的方法這一事實似乎(非常強烈地)暗示了完全相反的情況。

對原始數組的奇怪表示和行為的解釋是什么?

作為說明,我剛剛.clone()在數組的.clone()方法上使用“開放實現”Eclipse 功能,希望我能夠查看此方法的定義位置和方式(因為它說 int[ ] 從對象覆蓋它),但它實際上導致我的整個 Eclipse 凍結並崩潰......

每個數組類型都有一個類,所以有一個用於int[]的類,有一個用於Foo[]的類。 這些類是由 JVM 創建的。 您可以通過int[].classFoo[].class訪問它們。 這些類的直接超類是Object.class

public static void main(String[] args)
{
    test(int[].class);
    test(String[].class);
}

static void test(Class clazz)
{
    System.out.println(clazz.getName());
    System.out.println(clazz.getSuperclass());
    for(Class face : clazz.getInterfaces())
        System.out.println(face);
}

還有一個編譯時子類型規則,如果AB子類型,則A[]B[]子類型。

Java 語言規范應該給你一個想法:

數組類型的直接超類是 Object。

每個數組類型都實現了接口Cloneablejava.io.Serializable

此外

一個對象是一個類實例或一個數組。

因此數組不是實例,因此您不需要構造函數來創建它們。 相反,您使用Array Creation Expressions

請參閱下面的代碼。 它編譯:

    int[] arr = new int[2];
    System.out.println(arr.toString());

現在,在任何原始類型上,您不能調用 Object 類中定義的方法( toString() )(或者,任何與此相關的方法)......因此,數組本質上是一個Object

好的,給你:

來自JLS 第 4.3 節

有四種引用類型:類類型(第 8 節)、接口類型(第 9 節)、類型變量(第 4.4 節)和數組類型(第 10 節)。

並且,第 10 節

在 Java 編程語言中,數組是對象(第 4.3.1 節),是動態創建的,並且可以分配給對象類型的變量(第 4.3.2 節)。 Object 類的所有方法都可以在數組上調用。

所以,從第一句話開始, Array實際上不是一個類……它是另一種類型。 但是,本質上數組是對象,雖然不是某些Class ,但它們是Array類型。 所以它們不是某個類的實例,可能是array對象被定義為以這種方式創建......

如此簡短,是的 <Type>[] 是一種Object 據我所知,它直接從Object擴展。 上面有所有的 Object 方法, toString()hashCode() ,...加上一個特殊的暴露變量length java.util.Arrays是用於處理數組類型的實用程序類。 當您添加諸如int[]不繼承自Object[]類的東西時,這有點令人困惑。 此外,與其他Object類型不同,數組類型沒有構造函數。 他們尊重new關鍵字,但這通常是分配大小。 這有點奇怪,但這只是這些語言怪癖之一。

不過,要回答這個問題,是的,它們是一個對象。

數組是一個容器對象,它包含固定數量的單一類型的值。

請參閱http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

正如我們所知,只有 Java 中的那幾種原始類型。 基本上,我們仍然有幾個步驟來創建數組,例如聲明、構造或初始化(如果需要),這意味着數組確實是一個對象。

更深入地講,原始類型可以與原始值一起存儲在內存中,但對象是地址(引用)。 所以我們可以想象一個悖論,如果數組是原始類型,我們如何將原始值存儲在內存中? 我認為與 String 相同,但 String 是最終對象,因此您可以以簡單的方式構造對象,String s = "s",就像原始類型一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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