java中的点长度 - 找到它的定义

时间:2010-03-22 15:31:14

标签: java arrays

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

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

7 个答案:

答案 0 :(得分:12)

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

的摘录
  

数组类型的成员是以下所有成员:

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

尽管如此,当您在阵列上使用反射时仍然存在旧的错误:lengthclone都无法通过反射找到bug# 5047859,{{3} })。

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


“这是否意味着人们永远不会看到定义的长度变量?”

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

所以,不,你将无法看到定义的int 字段


有关进一步阅读,以下是有关Java反射的一些信息:

答案 1 :(得分:5)

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

答案 2 :(得分:2)

你需要比这更具体。

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

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

答案 3 :(得分:2)

在带数组的java中,您可以执行此操作。例如:

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

长度为3;

答案 4 :(得分:1)

任何类都可以有一个名为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)。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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