Java 数组是类实例吗?

Ald*_*reo 6 java arrays oop jls

Java 语言规范

一个对象是一个类实例或一个数组。

它还

数组 [...] 可以分配给 Object 类型的变量

让我困惑的部分是:

类 Object 是所有其他类的超类

如果数组可以分配给 Object 类型的变量,那么它必须意味着数组可以是对象(不仅表现为,而且可以改为)。那么就表示一个数组是一个类实例,这似乎与第一个引用不一致(如果是,那为什么它会被列为不同的东西?)。

这一切如何融合在一起?

Tho*_*sch 7

这并不矛盾。数组也是一个对象,尽管是一种特殊类型的对象。
这就好比说:鸟也是一种动物,尽管是一种特殊的动物。

您可以通过编译并运行以下 Java 代码来说服自己。

    String[] arrayOfStrings = { "bla", "blah" };
    
    // examine the class hierarchy of the array 
    System.out.println("arrayOfStrings is of type "
            + arrayOfStrings.getClass().getSimpleName()
            + " which extends from "
            + arrayOfStrings.getClass().getSuperclass().getSimpleName());
    
    // assingning the array to a variable of type Object
    Object object = arrayOfStrings;
Run Code Online (Sandbox Code Playgroud)

输出将是

arrayOfStrings is of type String[] which extends from Object
Run Code Online (Sandbox Code Playgroud)


Vas*_*sky 6

数组是 Java 本身提供给您的特殊类。它们都继承自共同的超类Object。由于它们继承自Object它们,因此当然可以在任何需要的地方使用Object。数组的实例确实是这些类的实例。人们甚至可以像引用其他类的文字一样引用数组类:

    Class<int[]> intArrayClass = int[].class;
Run Code Online (Sandbox Code Playgroud)

我看没有冲突。

这可能很有用https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.8

  • 是的,一些多余的句子,不是绝对最佳的定义 (2认同)

Ald*_*reo 3

是的……也不是。new Object[100] instanceof Object\xe2\x86\x92确实如此,true但这忽略了 Java 中数组的真正本质。数组是对象(小写),但不是对象(大写)。例如,作为对象,您必须使用new运算符为它们分配空间。

\n

然而,Java 语言规范说“对象是类实例或数组”是正确的,因为数组与常规对象有本质上的不同。它们继承自 C++ 等语言,这些语言深深植根于计算机的低级体系结构。

\n

“数组[...]可以分配给对象类型的变量”只是因为Java为我们程序员提供了一个接口来将数组称为对象。事实上,JLS 说

\n
\n

类 Object 的所有方法都可以在数组上调用

\n
\n

这当然是正确的,但从逻辑上讲并不意味着它们是对象。数组不是真正的对象;因此,它们不是真正的类实例,因此“对象类是所有其他类的超类”这句话在这里不适用。

\n

总而言之,Java 不是一种纯粹的面向对象编程语言(例如,基元不是对象,但它们仍然存在于 Java 中)。数组是 Java 包含的一项语言功能,其行为就好像它们是Object 类的类实例,但实际上并不是它的类实例

\n

[这是我试图总结这里提出的要点。非常感谢大家的想法,欢迎补充!]

\n