goodluck 发表于 2010-2-20 13:57:04

Java语言深入:关于java数组的深度思考

<p >刚刚开始接触java数组的人都会听到一句类似的话:java是纯面向对象的语言,他的数组也是一个对象。<BR>    于是乎,我就按照一个对象的方式来使用数组,心安理得。直到我接触到C的数组后,才发现将数组作为一个类来使用在实现上是多么的“不自然”。<BR>    首先我们看一下表面现象,数组创建的时候采用的是如下语句:<BR>    MyClass[] arr = new MyClass;<BR>    而普通类采用的是如下语句:<BR>   MyClass obj = new MyClass();<BR>   就是说,创建数组的时候不使用小括号传参。使得数组和普通类看起来就有很多不同,因为小括号里的参数是传递给构造方法的,进而让人感觉数组类是没有构造方法的。<BR>    再往深了想,还有很多让人感觉不自然的东西。可以肯定的是,java确实将数组作为了一个类来处理。还是用上面的例子说明:<BR>    可以通过以下方法得到MyClass[]的Class实例:<BR>    arr.getClass()或MyClass[].class.这样,我就可以向数组类里面“窥探”了。<BR>    Class clazz = MyClass[].class;<BR>    System.out.println(clazz.getConstructors()。length);<BR>    打印出来的结果是0;证明数组类确实没有构造方法。<BR>    如果强行执行clazz.newInstance();就会得到下面的错误。<BR>    java.lang.InstantiationException: arr = (arraytest.MyClass[]) Array.newInstance(arraytest.MyClass, 10);<BR>    下面这句话用来创建一个二维的、3乘5的、类型为arraytest.MyClass的数组:<BR>    int[] arrModel = new int[]{3,5};<BR>    Object arrObj = Array.newInstance(Sub.class, arrModel);<BR>    当然你可以用一个数组的引用指向上面的二维数组,这里我们用一个Object的引用指向他。<BR>    使用的时候,我们也是可以利用Array类提供的方法来实现:<BR>    System.out.println(Array.getLength(arrObj);//第一维长度为3 <BR>    System.out.println(Array.getLength(Array.get(arrObj, 2)));//第二维长度为5,这里如果写3,就会得到你意想之中的<BR>    java.lang.ArrayIndexOutOfBoundsException<BR>    打印结果是如我所想的:<BR>    3 <BR>    5<BR>    对于数组的Class类实例,还有一些奇怪的现象:在运行代码java.lang.reflect.Field fieldarr = clazz.getField("length");的时候,会抛出异常:java.lang.NoSuchFieldException: length,这似乎在说数组类没有length这个域,而这个域其实是我们用的最多的一个(也就是说这个域是肯定存在的)。我想关于数组的Class类实例、数组的实现等,还有很多“猫腻”在里面。<BR>    顺便说一句,java数组最多只能是255维的。这个让人看到了C的影子,嘿嘿。<BR>    “Java把数组当作一个java类来处理”说起来容易,用起来自然,但是细细想来,还是有很多不简单的地方呀。<p ><P align=right></P><p align="center"></p></p>
页: [1]
查看完整版本: Java语言深入:关于java数组的深度思考