数组

数组在java中是个很奇怪的类。首先它确实是个对象,但它没有类的实体。所有它也就没有构造函数。数组的创建是这样的

int[] arr = new int[5];

而普通的类的创建是这样的

String str = new String();

普通的类的创建通过小括号给构造函数传递参数,而数组是用中括号。另外用

System.out.println(new Object[1].getClass());

可以看到数组的类是这样的

class [Ljava.lang.Object;

是不是很奇怪,java中用“[”+“L”作为数组的唯一标示,其中“L”是会变的,如果是基本数据类型,则就是类型名的开始字母大写,除了long类型,long数组是[J。其他的复合数据类型,都是用[L表示的。

那猜猜看如果是二维数组呢?三维数组呢?

是这样的class [[Ljava.lang.Object;

由此可见,每多一维,多一个[

虽然数组没有类的实体,但是我们却可以得到这个类的Class实例。得到数组的Class之后我们可以通过反射机制来“窥探”数组的“内部结构”。

Class cl = int[].class;
System.out.println(clazz.getConstructors().length);

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

JDK API中有一个java.lang.reflect.Array类,这个类提供了很多方法,包括数组的创建以及数组内容的获取与设置。

从上面的一些说法中,我们会发现一些“矛盾”。。。前面我们说数组没有类的实体,那么它肯定也没有成员属性,那么我们常用的数组.length是什么鬼???用反射获取数组类的成员属性的数量看看:

java.lang.reflect.Field fieldarr = clazz.getField("length");

这会抛出异常:

java.lang.NoSuchFieldException:length

posted on 2015-11-19 23:40  Sampwood  阅读(168)  评论(0)    收藏  举报

导航