java中的点长度 – 找到它的定义
在哪个类是Java中定义的length
字段(例如,对于数组长度)? 我能在Object
类中看到它定义吗?
编辑:为什么这个领域如此设计(任何与安全或内存效率相关的事情)?
数组类型在Java中是特殊的。 这是JLS 10.7arrays成员的摘录
数组类型的成员是以下所有成员:
public final
字段length
,包含数组的组件数(长度可以是正数或零)。public
方法clone
,它覆盖Object
类中相同名称的方法,并且不会抛出任何已检查的exception。 数组类型T[]
的克隆方法的返回类型是T[]
。- 所有成员都inheritance自Object类; 唯一没有inheritance的Object方法是它的
clone
方法。
尽管如此,当您在arrays上使用reflection时仍然存在旧的错误:通过reflection都找不到length
和clone
( bug#5047859 , bug#4987375 )。
这两个成员都不是以任何超类的传统方式inheritance的; 所有数组类型都直接从Object
扩展。 这种“特殊处理”可能是为什么这些错误首先存在的原因。
“这是否意味着人们永远不会看到定义的长度变量?”
数组类型没有实际的源代码。 同样,这些类型是特殊的; JVM只是在需要时从帽子中取出这些类型。 您将看不到数组类型int[].class
.java
源文件(即所有int
数组的类型)。
所以,不,你将无法看到定义的length
字段 。
有关进一步阅读,以下是有关Javareflection的一些信息:
- Java教程:Reflection API
- 高级语言主题技术文章:使用Javareflection
数组不像常规类,它们是Java语言规范中定义的特殊情况。 因此.length public final变量在Java语言规范中定义,但它实际上并未在.java或.class文件中的任何位置定义。
你需要更具体一点。
可变长度可以存在于任何类中。 如果您的意思是API,那么您可能正在寻找数组。
有些类有一个length()方法。
在带有数组的java中,您可以执行此操作。 例如:
String[] a = new String [] {"a","b","c"}; int length = a.length;
长度为3;
任何类都可以有一个名为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
)。
这个问题没有一个答案。 任何人都可以在一个类中包含一个length
变量,但不能保证它存在 – 或者,如果确实存在,那么它是公共的 – 在任何给定的类中。 你真的只需要阅读你感兴趣的课程的来源。
我会说在广泛使用的JavaBean约定中 ,可以合理地具有length属性但没有公共变量length
通常具有getLength()
和setLength()
方法。 由于一些超出你的问题范围的原因,这比公共变量更好,但如果你有兴趣,请查看这个相关的SO问题 。
它是一个变量,可以访问数组以找出数组中有多少元素。