对象 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"(或者随便你怎么称呼它)。但并不是每一个你能画下来的形状...都会是一个圆。
抱歉,如果之前有人问过这个问题。我对对象 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"(或者随便你怎么称呼它)。但并不是每一个你能画下来的形状...都会是一个圆。