数组
数组在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
浙公网安备 33010602011771号