这并不矛盾。数组也是一个对象,尽管是一种特殊类型的对象。
这就好比说:鸟也是一种动物,尽管是一种特殊的动物。
您可以通过编译并运行以下 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)
数组是 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
是的……也不是。new Object[100] instanceof Object\xe2\x86\x92确实如此,true但这忽略了 Java 中数组的真正本质。数组是对象(小写),但不是对象(大写)。例如,作为对象,您必须使用new运算符为它们分配空间。
然而,Java 语言规范说“对象是类实例或数组”是正确的,因为数组与常规对象有本质上的不同。它们继承自 C++ 等语言,这些语言深深植根于计算机的低级体系结构。
\n“数组[...]可以分配给对象类型的变量”只是因为Java为我们程序员提供了一个接口来将数组称为对象。事实上,JLS 说:
\n\n\n类 Object 的所有方法都可以在数组上调用
\n
这当然是正确的,但从逻辑上讲并不意味着它们是对象。数组不是真正的对象;因此,它们不是真正的类实例,因此“对象类是所有其他类的超类”这句话在这里不适用。
\n总而言之,Java 不是一种纯粹的面向对象编程语言(例如,基元不是对象,但它们仍然存在于 Java 中)。数组是 Java 包含的一项语言功能,其行为就好像它们是Object 类的类实例,但实际上并不是它的类实例。
\n[这是我试图总结这里提出的要点。非常感谢大家的想法,欢迎补充!]
\n| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |