如何理解数组的length?


Java中的数组其实也是一个对象,但是确实是一个特殊的对象,实在是太特殊了,


以致我们都不好把它多做对象处理。


1.数组是对象,继承自Object
唯一比Object多一个成员变量length,而且应该是public的。


2.java.lang.reflect.Array是final的,所以数组肯定不是它的子类
这个类用来动态生成数组或者操作数组(获得长度等).


3.java.util.Arrays是一个数组操作应用类,主要就是排序,填充,而分查找等。
注意:排序使用的是快速排序,时间复杂度是o(n*log(n)),如果你要对数组排序
Arrays绝对是首选。


4.数组没有对应的类文件,String对应String.class.但是数组却没有,而且他们的
类名字很古怪,可以这样获得 new int[2].getClass().getName();
这是和其他对象最大的不同点,因为数组类是在运行时生成的。


5.数组的length是什么?
第一步:我们确定数组的父类是Object,
new Object[0].getClass().getSuperClass() 是Object.class
很显然Object没有length变量,所以应该是数组中的成员变量
第二步:new Object[0].getClass().getDeclaredFields() 返回的数组长度
为0,这里我们自然动态活动这个数组的Class,但是结果证明这个Class里没有
对length的定义,这个完全和第一步得出的违背。
第三步:很显然第一步和第二步是想矛盾的,但是第一步的分析完全没有错呀。
我也无法知道究竟是怎么回事,这里有两种可能,我比较支持第二步的结果。


数组类根本没有length成员变量,这样就和第二步的结果相同
对于 Object[] objs=new Object[2];
这个数组对象很显然和一般的对象不一样,一般的构造函数不是这个样子的。
对于 int i=objs.length; 
因为我猜测是数组类是没有length成员的,但是这里却明明可以调用,我觉得
这里是编译器处理过的,他会在编译时把数组的length调用转化成一个方法
调用,比如Array.getLength(obj);虽然我试图用这两种方法编译成class文件
后用javap得到不同的JVM指令,我仍然觉得是编译器处理的数组的length!


如果我是错的,谁能帮我解释一下第二步发生的事!