对象 Class 中的长度字段

length field in Object Class

抱歉,如果之前有人问过这个问题。我对对象 class 的长度字段有一些疑问。如果我错了请纠正我,Every class impilcitly extends Object class 这就是为什么我们可以访问每个方法,如 equals、clone、hashcode 等

所以我的问题是当我们创建任何数组时,例如 int[] 数组,foo[] 我们可以访问对象的长度字段 class 但是当我们创建任何对象时,我们看不到长度变量,为什么?

Object class 没有定义 length 字段,Object 也没有。

length 字段仅针对数组类型 定义。 JLS 状态:

"In the Java programming language, arrays are objects (§4.3.1), are dynamically created, and may be assigned to variables of type Object (§4.3.2). [...] The array's length is available as a final instance variable length."

长度字段是隐式定义的。没有可以看到 field 定义的 Java API class 声明。 length字段通常由"JVM magic"实现;例如在对象头中。甚至有一个特殊的字节码 (arraylength) 来访问它。

... when we create any object we can not see length variable, why?

为什么?因为它没有!

根据我的理解,数组的长度是在初始化数组时设置的大小变量,它给出了数组的实际容量。由于一旦初始化就无法更改数组的容量,因此 Object []arr = new Object[2]; System.out.length(arr.length) 可以正常工作。 public 最终字段长度,其中包含数组的组件数。长度可以是正数或零。

你得注意"inheritance"往哪个方向走。您可能知道,"inheritance" 是关于定义 "is a" 关系。如果基础 class 定义字段、方法,那么您可以在派生的 classes.

中访问它们

因此,在 Java 中,任何整数 都是一个 对象。或者,任何类型的数组 都是一个 对象。

反向则不然。任意对象 不是 数组!意思是:如果你创建一个对象,比如 bar = new Object() 那么 bar 没有数组的任何属性;因为 bar 是一个对象;但不是数组。

因此您在 Object 上找不到 "length",因为 Object 不是数组

当然,如果对象是 "really" 其他东西,例如:

int[] numbers = { 1, 2, 3 };
Object foo = numbers;

然后你可以随时进行转换,例如:

int[] anotherRefToNumbers = (int[]) foo;

编辑:只是为了提供不同的视角。如果你坐下来在一张纸上画一个圆圈;这个圈子也是一个 "shape"(或者随便你怎么称呼它)。但并不是每一个你能画下来的形状...都会是一个圆。