黑马程序员技术交流社区

标题: 数组的反射 [打印本页]

作者: Morgan    时间: 2015-7-6 13:23
标题: 数组的反射
1.数组也是一种类型,每一个具有相同的元素类型以及具有相同的维度的数组都属于同一个Class。也就是他们是同一种类型。
2.例子
  1. int[] a1 = new int[]{1,2,3};
  2.                 int[] a2 = new int[4];
  3.                 int[][] a3 = new int[2][3];
  4.                 String[] a4 = new String[]{"a","b","c"};
  5.                 System.out.println(a1.getClass() == a2.getClass());//true
  6.                 // System.out.println(a1.getClass()==a4.getClass());
  7.                 // System.out.println(a1.getClass()==a3.getClass());
  8.                 System.out.println(a1.getClass().getName());//[I
  9.                 System.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object
  10.                 System.out.println(a3.getClass().getSuperclass().getName());//java.lang.Object
  11.                 System.out.println(a4.getClass().getSuperclass().getName());//java.lang.Object
  12.                 Object obj1=a1;//通过。父类引用指向子类对象
  13.                 Object obj3=a3;//通过。父类引用指向子类对象
  14.                 Object obj4=a4;//通过。父类引用指向子类对象
  15.                 //Object[] obj6=a1;//编译失败,a1里面存的是int类型,而int不是Object的子类型
  16.                 Object[] obj7=a3;//通过,a3是二维数组,可以看做a3是一维数组里面的元素又是一维数组。而一维数组是Object的子类型。
  17.                 Object[] obj5=a4;//通过,a4是一维数组,但里面存入的是String对象,String对象是Object的子类型。
  18.                
  19.                 System.out.println(a1);//[I@659e0bfd
  20.                 System.out.println(a4);//[Ljava.lang.String;@2a139a55
  21.                 System.out.println(Arrays.asList(a1));//[[I@659e0bfd]  原因,按jdk1.4的语法无法处理a1不能赋值给Object数组,所以用jdk1.5的语法,a1作为一个可变参数传入
  22.                 System.out.println(Arrays.asList(a4));//[a, b, c].原因,按jdk1.4的语法asList接收Object[],按照上面的推理a4可以复值给Object数组。
复制代码

3.Class类中使用getName返回类型名称的说明
public String getName()

返回类对象所代表的实体的名称的字符串(class, interface, array class, primitive type, or void)
如果这个类对象代表一个引用类型而不是一个数组类型那么类的二进制名称被返回。
如果类对象代表一个原始类型或者void,那么返回的名称是一个字符串等于java语言的关键字.
如果类对象代表的类型是数组,那么内部形式名称组成名称元素前面放上一个或者多个‘[’字符代表嵌套的数组的深度,元素类型的编码名称如下:
Element Type                     Encoding
boolean                     Z
byte                     B
char                     C
class or interface                     Lclassname;
double                     D
float                     F
int                     I
long                     J
short                     S

类或接口的名称classname就是他的全名.
例子:

String.class.getName()
     returns "java.lang.String"
byte.class.getName()
     returns "byte"
(new Object[3]).getClass().getName()
     returns "[Ljava.lang.Object;"
(new int[3][4][5][6][7][8][9]).getClass().getName()
     returns "[[[[[[[I"









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2