繁体   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