簡體   English   中英

為什么沒有 java.lang.Array 類? 如果一個java數組是一個對象,它不應該擴展對象嗎?

[英]Why isn't there a java.lang.Array class? If a java array is an Object, shouldn't it extend Object?

這是 java 包樹: http ://docs.oracle.com/javase/7/docs/api/java/lang/package-tree.html

我讀了一篇關於 Java 的教程,其中指出在 Java 中數組是對象。

數組類在哪里? 為什么我們可以制作這樣的數組:

byte[] byteArr = new byte[];
char[] charArr = new char[];
int[] intArr = new int[];

並且數組將從 Object 繼承方法; 例如:

    byte thisByte = 1;
    byte thatByte = 2;
    byte[] theseBytes = new byte[] {thisByte, thatByte};
    int inheritance = theseBytes.length; //inherited 'length' field and some methods
    int wasntInWill = thatByte.length; //error

這里發生了什么?

編輯:

根據答案,我現在知道它是java.lang.reflect包中的final類。

我現在在我的 Android 項目中創建了一個包java.lang.reflect並添加了一個名為 Array.java 的類。 為了確認這是原始類的方式,Eclipse 給了我錯誤“...已經存在於 path/to/android.jar”

如果我寫出與java.lang.reflect.Array相同的類但更改toString()方法......這應該在我的應用程序中工作,對嗎?

來自JLS

每個數組都有一個關聯的 Class 對象,與具有相同組件類型的所有其他數組共享。 [這] 就好像:數組類型的直接超類是 Object [並且] 每個數組類型都實現了接口 Cloneable 和 java.io.Serializable。

以下示例代碼顯示了這一點:

class Test {
    public static void main(String[] args) {
        int[] ia = new int[3];
        System.out.println(ia.getClass());
        System.out.println(ia.getClass().getSuperclass());
    }
}

打印:

class [I
class java.lang.Object

其中字符串"[I"是類對象"array with component type int"的運行時類型簽名。

是的,因為數組類型有效地擴展了 Object,你可以在 arrayObject 上調用 toString() 也可以看上面的例子

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

數組是一種語言特性——它們具有用於聲明和訪問的特定語法。 他們的類定義對你隱藏。

它們在反射 API 中有一個表示形式 - java.lang.reflect.Array

順便說一句, length字段不是從Object繼承的。 .getClass().toString()等方法被繼承。

對上述代碼段稍加闡述:

public class ClassForName {
    public static void main(String[] argv) throws ClassNotFoundException {
        Class theClass = Class.forName("[I");
        System.out.println(theClass.getName());
        Class superClass = theClass.getSuperclass();
        System.out.println(superClass.getName());
    }
}

結果:

C:\JavaTools>java ClassForName
[I
java.lang.Object

可以看出,“[I”是類的名稱,用英文稱為“array of int”。 該類是一個“完全公民”的Java 類,它響應Object 的所有方法。 唯一不同的是new的語法不同,不支持Class的newInstance()方法。

(類“[I”、“[C”等,在 JVM 中是“預定義的”——沒有對應於它們的 .class 文件。Java 也會在運行中隱式創建“[ MyJavaClass;" 類,如果您的程序中有一個“MyJavaClass”數組。)

為什么沒有數組類?

數組類,程序中使用的每種元素類型都有一個。 JLS 和 JVM Spec 都明確指出,數組的類對象是動態創建的。 JLS #10.8 “數組的類對象”JVM Spec #5.3.3 “創建數組類”

如果一個java數組是一個對象,它不應該擴展Object?

它確實擴展java.lang.Object. JLS #10.8 明確指出“每個數組類型的直接超類是 Object。”

暫無
暫無

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

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