一个关于用Array.newInstance方式创建多维数组的问题
在论坛中看到的问题,自己弄明白后回复的答案,随笔记录下:
import java.lang.reflect.Array;
public class Test{
public static void main(String[] agrs){
//定义三维数组的各维大小,第一维5,二维10,三维15
int dims[]={5,10,15};
//创建一个int类型的dims.length维数的新数组,dims.length等于3,即创建一个三维数组
Object arr=Array.newInstance(Integer.TYPE,dims);
//获取三维数组中的角标为3的元素即一个[10][15]的二维数组
//第一维设置为5,所以最大不能超过4
Object arrobj=Array.get(arr,3);
//显示arrobj二维的class值
System.out.println(arrobj.getClass());
//arrobj是个三维下的二维数组,获取的cls是arrobj中的元素类型,即一个一维数组
Class cls=arrobj.getClass().getComponentType();
System.out.println(cls);
//设置二维数组arrobj中的值,设置麻烦
Array.set(arrobj, 9, new int[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14});
//输出,需将Object转换成二维数组类型
int[][] a = (int[][])arrobj;
System.out.println(a[9][14]);
}
}
1、数组创建的方法有很多种:
int[] anArray ;//这一步只是做了声明,内存中并没分配,这一点是和C/C++不同的地方
anArray = new int[10];//这一步数组才真正建立
int[] anArray = {1,2,3};
2、数组与Array类的关系:
数组的写法与创建方式与一般的类有很大的不同,我一直认为数组与Java基本数据类型相似。其实不是。数组的创建确实与一般的类有所不同。
Java中的所有数组都是通过Array类实例化。Array类没有public的构造方法,数组是通过Array的newInstance()方法进行实例化。
源代码如下:
一维数组:
public static Object newInstance(Class> componentType, int length)//componentType 数组的类型,length数组的长度
throws NegativeArraySizeException {
return newArray(componentType, length); //这个方法会调用底层C代码开辟内存空间
}
多维数组:
public static Object newInstance(Class> componentType, int... dimensions)
throws IllegalArgumentException, NegativeArraySizeException {
return multiNewArray(componentType, dimensions);
}
3、除去各种通过编译器简单化的写法后,还原真实的数组创建,过程如下:
Object array = Array.newInstance(int.class,2);//创建数组实例
Array.set(array, 1/*index*/, 1);// 给数组元素赋值
Array.get(array, 1/*index*/);//取值
多维数组的类似,只是set和get的时候把第二维维度的数组理解为第一维度中的数据值的数据类型即可。
如:
Object array = Array.newInstance(int.class, 2,2);
Object arrayF = Array.get(array, 0);
Array.set(arrayF, 0, 1);
4、本人的一些猜想
1、数组的实例化之所以不用构造函数的方法,是因为数组的类型其实是无数种。用构造方法来实例化不利于对不同类型数组的扩展。
2、每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
3、Java反射技术除了可以在运行时动态地决定要创建什么类型的对象,访问哪些成员变量,方法,还可以动态地创建各种不同类型,不同维度的数组。
*花边知识
2、for循环遍历数组的方法
Employee[] staff = new Employee[3];
staff[0] = new Employee("a");
staff[1] = new Employee("b");
staff[2] = new Employee("c");
for( Employer e : staff){
System.out.println( e.getName() );
}