【问题标题】:length field in Object Class对象类中的长度字段
【发布时间】:2016-08-27 04:19:27
【问题描述】:

抱歉,如果之前有人问过这个问题。我对 Object 类的长度字段有一些疑问。如果我错了,请纠正我,每个类都隐含地扩展了 Object 类,这就是为什么我们可以访问每个方法,例如 equals、clone、hashcode 等

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

【问题讨论】:

  • 因为length 没有在Object 中定义
  • 同样的原因,您看不到 asdf 变量或 foobar 变量。
  • 那么长度字段是在哪里定义的?

标签: java arrays object variable-length


【解决方案1】:

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

length 字段是为的数组类型定义的。 JLS 声明:

“在 Java 编程语言中,数组是对象(第 4.3.1 节),是动态创建的,并且可以分配给 Object 类型的变量(第 4.3.2 节)。[...] 数组的长度是可用的作为最终实例变量长度。”

长度字段是隐式定义的。没有 Java API 类声明,您可以在其中看到 field 定义。 length 字段通常由“JVM 魔术”实现;例如在对象头中。甚至还有一个特殊的字节码 (arraylength) 可以访问它。

...当我们创建任何对象时,我们看不到长度变量,为什么?

为什么?因为它没有!

【讨论】:

  • 那么长度字段是在哪里定义的?
  • @FaisalAhmed 关于动态创建的数组类。请参阅JLS在 Java 编程语言中,数组是对象(第 4.3.1 节),是动态创建的,并且可以分配给 Object 类型的变量(第 4.3.2 节)。 [...] 数组的长度可用作 final 实例变量 length
  • 在哪里声明的?无处!它是>>隐式
  • 谢谢斯蒂芬这真的很有帮助
【解决方案2】:

您必须注意“继承”的方向。您可能知道,“继承”是关于定义“是”的关系。如果基类定义了字段、方法,那么您也许可以在派生类中访问它们。

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

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

因此您在 Object 上找不到“长度”,因为 Object 不是数组

当然,如果一个对象“真的”是别的东西,比如:

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

那么你总是可以做一个演员,比如:

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

编辑:只是为了给出不同的观点。如果你坐下来在一张纸上画一个圆圈;这个圆圈也是一个“形状”(或任何你想称呼它的人)。但并不是所有你可以画下来的形状……都是圆形。

【讨论】:

  • 您能否更清楚地定义这个术语先生“对象不是数组”。
【解决方案3】:

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

【讨论】:

  • 这个兄弟我很了解。我的问题是为什么我们在创建普通对象时看不到长度?我从 Stephen C 那里得到了答案。现在我在想它是在哪里隐式定义的?
猜你喜欢
  • 1970-01-01
  • 2018-01-28
  • 2016-03-03
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多