【问题标题】:dot length in java - finding its definitionjava中的点长度 - 找到它的定义
【发布时间】:2010-03-22 15:31:13
【问题描述】:

在 Java 中定义的 length 字段在哪个类中(例如,用于数组长度)? 我能在Object 类中看到它的定义吗?

编辑:为什么要设计这个字段(与安全性或内存效率相关的任何事情)?

【问题讨论】:

  • 我们说的是字符串长度、数组长度、对象大小还是什么?
  • @Jason:我认为他在谈论数组。
  • @Jason,我认为他在谈论 array.length,String 没有长度变量,它有 length() 方法(这很令人困惑,因为它不是 getLength())。跨度>
  • 这是我的假设。
  • 最好不要假设;缺少 String.length 也可能是他问的原因。

标签: java arrays


【解决方案1】:

数组类型在 Java 中是特殊的。这是JLS 10.7 Array Members的摘录

数组类型的成员都有以下几种:

  • public final 字段 length,其中包含数组的组件数(长度可以是正数或零)。
  • public 方法clone,它覆盖了类Object 中的同名方法并且不抛出任何检查异常。数组类型T[]的克隆方法的返回类型为T[]
  • 继承自Object类的所有成员; Object 唯一没有被继承的方法是它的clone 方法。

尽管如此,当您在数组上使用反射时,仍然存在一些老生常谈的错误:lengthclone 都无法通过反射找到(bug# 5047859bug# 4987375)。

这两个成员都不是以传统方式从任何超类继承的;所有数组类型都直接从Object 扩展。这种“特殊处理”很可能是这些 bug 存在的原因。


“这是否意味着永远无法看到正在定义的长度变量?”

没有数组类型的实际源代码。同样,这些类型很特殊。 JVM 只是在需要时从帽子中取出这些类型。您将看不到数组类型 int[].class(即所有 int 数组的类型)的 .java 源文件。

所以,不,您将无法看到定义的length 字段


为了进一步阅读,这里有一些关于 Java 反射的信息:

【讨论】:

  • 这是否意味着永远无法看到定义的长度变量?
  • 我不明白'could be found through reflection'这个短语你能解释一下吗?
  • @abson:我添加了一些评论来解决您的 cmets。请随时要求更多说明。
  • @polygenelubricants 能否告诉我对长度字段进行这种特殊处理的原因。
  • 特殊处理实际上是对数组类型作为一个整体。您可以定义任何类型的任何维度的数组。 int[].class 是数组类型,int[][].class 是另一种数组类型,Thing[].classStuff[][].class 也是如此。 Java 必须根据需要按需创建这些类型;它们没有源代码。
【解决方案2】:

数组不像常规类,它们是Java Language Specification 中定义的特殊情况。所以 .length public final 变量是在 Java 语言规范中定义的,但它实际上并没有在 .java 或 .class 文件的任何地方定义。

【讨论】:

  • 这是否意味着它是在Object类中定义的?
  • +1 击败我到 JLS 链接。 @abson,不,它不在 Object 类中。如果你打印出 someArray.getclass(),你会得到一些非人类可读的东西,它是语言中内置的一种特殊类型。
【解决方案3】:

你需要比这更具体一点。

可变长度可以存在于任何类中。如果您指的是 API,那么您可能正在寻找 Array。

有些类有一个 length() 方法。

【讨论】:

  • 有些有长度属性(如数组),有些有length()方法,如String,还有一些有size()方法,如各种集合。
  • 是的,它是数组的长度属性
【解决方案4】:

在带有数组的 java 中你可以做到这一点。例如:

String[] a = new String [] {"a","b","c"};
int length = a.length;

长度为 3;

【讨论】:

  • 但他在问长度变量在哪里?
  • 是的@jschoen,你能告诉我你的程序中使用的长度变量是在哪里定义的吗?
  • 正如 Yishai 所说,它并没有按照您的思维方式真正定义。它是语言本身的一部分。内置,如果你愿意的话。所以你不会在 .java 文件中找到它。也许你问错了问题。你想通过追踪这个来完成什么?也许我们可以在这方面提供更多帮助。
  • 我没有得到“语言本身的一部分”这一行。 @jschoen 能否解释一下所谓的 JLS 是什么?
  • JLS 是 Java 语言规范。它很长,老实说不是一本有趣的书,但很有趣。它本质上是一个解释Java语言、标准等细节的文档。它被定义为你编程java的资源。
【解决方案5】:

任何类都可以有一个名为length的字段。只需添加它。

数组没有length 字段;他们有一些看起来像这样的领域:

int[] a = new int[10];
System.out.println("array length is: " + a.length);

但它真的不是一个普通的字段,因为这不会编译:

int[] a = new int[10];
a.length = 42;  // <- here the compiler gets grumpy

并且,在 JVM 级别,使用特定操作码 (arraylength) 访问数组长度,而不是通用实例字段访问操作码 (getfield)。

【讨论】:

    【解决方案6】:

    这个问题没有单一的答案。任何人都可以在一个类中包含一个length 变量,但不能保证它存在——或者,如果它确实存在,它是公共的——在任何给定的类中。你真的只需要阅读你感兴趣的课程的源代码。

    我会说,在广泛使用的JavaBean convention 中,可以合理地具有长度属性但没有公共变量length 的类通常具有getLength()setLength() 方法。这比公共变量要好,原因有很多,这些原因超出了您的问题范围,但如果您有兴趣,请查看this related SO question

    【讨论】:

    • 是的,它是数组的长度属性,您能告诉它实际定义的位置吗?
    【解决方案7】:

    它是一个可以访问数组的变量,以找出数组中有多少元素。

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 2014-12-15
      • 2011-11-19
      • 2016-02-23
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多