这个问题其实我也困惑过。。。今天看到你的问题才引起我真正的关注~~
我帮你查找到了一个相对满意的答案。希望对你有所帮助 ~~~
声明:以下内容非本人原创。全部引用自BruceZMF的博客 http://blog.sina.com.cn/s/blog_680f6fa70100kg7b.html
在此谨向BruceZMF致敬
在他的博客里对这个length的问题作了深层次的探讨,即便不能彻底领会底层知识,至少也可以获得某种启发
祝共同进步!!
(一)问题 在所有数组中有唯一的一个属性——length,那么这个属性是在Java的哪一个类中的呢?这些数组的这个属性是从哪来的?不明白.... (二)回复 数组是Java特殊处理过的,
int i = args.length;
可以通过javap 看到指令为
aload_0
arraylength
istore_1
return
可见Java专门为Array定义了取得长度的指令了
------------------------------------------------------------------------------
数组的length即不是方法,也不是字段。
在一个数组对象上调用length,会被Java编译器编译成一条arraylength指令(Java binary code)。
而访问字段的语句会被编译成getfield或getstatic指令,调用方法的语句则会被编译成invokestatic,invokevirtual或invokespecial等指令。
Java字节码中有许多单独针对数组的指令,它们在其它任何非数组类型的对象上调用都是毫无意义的。
由此可见,它们本就不一样,不能等同起来直接进行对比。
------------------------------------------------------------------------------
1.length不是array的方法或者属性
这个很好证明:new个数组出来 getDeclaredFields()是0
2.java对数组的操作是指令级的。
|