如何理解数组的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!
 
   如果我是错的,谁能帮我解释一下第二步发生的事!
 
 
 
 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值