数组是Java特殊处理过的, int i = args.length;可以通过javap 看到指令为 aload_0 arraylength istore_1 return 可见Java专门为Array定义了取得长度的指令了
还有,两个字符串相加并不是JVM本身做的事情,也就是Java内部并非对String作出了特殊处理String s = args[0] + args[1];实际编译后的代码等同于: String s = (new StringBuilder()).append(args[0]).append(args[1]).toString();这中间的变换是编译器做的事情,而非JVM做的
而这个属性返回的应该是调用Array类中的getLength(Object array)方法以 int 形式返回指定数组对象的长度?具体也不是很清楚,期望高手解答
java.lang.reflect.Array.getLength(Object array)竟然是一个静态的native方法。
数组中的length是方法,而不是属性
---------------------------------------------
ls的ls的ls,数组中的length是属性不是方法。不信自己试试看。===========================================================
回复人:iamsangster(浪人(★★★★★) ( 一级(初级)) 信誉:96 2007-06-07 15:44:59 得分:0
在某个.dll文件中
------------------------------------------------------------
ls的ls,不会吧,在某个dll文件中,那Java怎么跨平台运行啊。===========================================================
回复人:cxz7531(大花猫) ( 五级(中级)) 信誉:97 2007-06-07 15:55:38 得分:0
?
数组实际上是一个特殊的类
------------------------------------------------------------
ls的说得有理,数组是一个类这是肯定的,因为它有从Object中继承下来的10个方法。就是不太明白这个length属性是从哪来的。
两个String对象可以用“+”进行连接,那是java特意为string类重载了操作符。string类本身没有什么特殊之处。
而数组则是一个典型的特殊类。没有类文件,而且在运行时产生维护
------------------------------------------------------------------------------
ls的ls,为什么说是在运行时产生维护的?有什么根据呢?
int i = args.length;可以通过javap 看到指令为
aload_0
arraylength
istore_1
return
可见Java专门为Array定义了取得长度的指令了
String s = (new StringBuilder()).append(args[0]).append(args[1]).toString();这中间的变换是编译器做的事情,而非JVM做的
在一个数组对象上调用length,会被Java编译器编译成一条arraylength指令(Java binary code)。
而访问字段的语句会被编译成getfield或getstatic指令,调用方法的语句则会被编译成invokestatic,invokevirtual或invokespecial等指令。
由此可见,它们本就不一样,不能等同起来直接进行对比。
至于它“是不是属性”,那就看你怎么理解“属性”这个词了。
就像两个字符串+的话 实际上是用StringBuilder了
这个很好证明:new个数组出来 getDeclaredFields()是0
2。java对数组的操作是指令级的。
组数 有个 length 应该说不是对象