关于java数组的深度思考

文章作者 100test 发表时间 2007:03:10 18:41:39
来源 100Test.Com百考试题网


刚刚开始接触java数组的人都会听到一句类似的话:java是纯面向对象的语言,他的数组也是一个对象。于是乎,笔者就按照一个对象的方式来使用数组,心安理得。直到我接触到C的数组后,才发现将数组作为一个类来使用在实现上是多么的“不自然”。

首先我们看一下表面现象,数组创建的时候采用的是如下语句:

  MyClass[] arr = new MyClass[9].

  而普通类采用的是如下语句:

  MyClass obj = new MyClass().

  就是说,创建数组的时候不使用小括号传参。使得数组和普通类看起来就有很多不同,因为小括号里的参数是传递给构造方法的,进而让人感觉数组类是没有构造方法的。

  
再往深了想,还有很多让人感觉不自然的东西。可以肯定的是,java确实将数组作为了一个类来处理。还是用上面的例子说明:

  可以通过以下方法得到MyClass[]的Class实例:arr.getClass()或MyClass[].class。这样,我就可以向数组类里面“窥探”了。

  
  Class clazz = MyClass[].class.
  System.out.println(clazz.getConstructors().length).

  
  打印出来的结果是0;证明数组类确实没有构造方法。

  
  如果强行执行clazz.newInstance().就会得到下面的错误。

  java.lang.InstantiationException: [Larraytest.MyClass.

  证明数组类不能够通过普通的反射方式来创建一个实例。

  
  再看看数组类的“庐山真面目”:

  System.out.println(clazz).

  输出是:

  [Larraytest.MyClass

  对Java Class文件结构稍有了结就知道,这个字符串的意思就是一个元素类型为arraytest.MyClass的一维数组。也就是说,数组类型不是和普通类一样,以一个全限定路径名 类名来作为自己的唯一标示的,而是以[ 一个或者多个L 数组元素类全限定路径 类来最为唯一标示的。这个()也是数组和普通类的区别。而这个区别似乎在某种程度上说明数组和普通java类在实现上有很大区别。因为java虚拟机(java指令集)在处理数组类和普通类的时候,肯定会做出区分。笔者猜想,可能会有专门的java虚拟机指令来处理数组。



相关文章


Java更多的库谜题76:乒乓
Java更多的库谜题80:更深层的反射
二级Java考试辅导教程:1.1java语言概述
java使用命令行参数
关于java数组的深度思考
JavaSE6入门之脚本引擎让程序如虎添翼
JavaME下的单元测试开发之JMUnit篇
谈谈如何保证测试代码的正确性
从简单程序看java运行错误
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛