黑马程序员技术交流社区

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

作者: 燕国庆    时间: 2012-12-4 17:35
标题: 数组反射的疑惑
int[] a=new int[3];
int[] b=new int[4]
int[][] c=new int[4][2];


System.out.println(a.getClass()==b.getClass());
System.out.println(a.getClass()==c.getClass());//为什么此行代码编译时不能通过那,任意两个对象通过getClass()方法不就能比较是否相同吗?而利用equals就能通过那
System.out.println(a.getClass().equals(c.getClass()))
作者: xjandrew    时间: 2012-12-5 15:14
本帖最后由 xjandrew 于 2012-12-5 15:18 编辑

编译不通过是因为它们是不兼容的两个类型
从int型是不能转换成object的 int是基本类型 不是对象类型

同时getClass()是Object 的方法。
对于数组类型,数组有从Object继承吗?(于是我也纳闷了,可以调用getClass()方法吗?)
用此方法时,
System.out.println(a.getClass());
一维数组会返回class [I  
System.out.println(c.getClass());
二维数组会返回class [[I
返回的这两个类型不是类,它们得比较同两个基本数据类型,
比如:System.out.println(1==true);一样,会出现无法比较的编译错误。
作者: xjandrew    时间: 2012-12-5 15:31
本帖最后由 xjandrew 于 2012-12-5 15:43 编辑

咱再看看错误提示
Incompatible operand types Class<capture#3-of ? extends int[]> and Class<capture#4-of ? extends int[][]>
a.getClass()
它的泛型类是继承int[]一维数组的
c.getClass()
它的泛型类是继承int[][]二维数组的

==和equals()
==是一个关系运算符,用于判断两个简单变量的值是否相等,或两个引用变量的引用地址是否相等
equals()是一个方法,用于判断引用变量引用地址指向的存储内容是否相等

这样看来,==不存在自动调用其父类中方法的可能
作者: 怪盗急得    时间: 2012-12-5 17:21
int[] a=new int[3];
int[] b=new int[4]
int[][] c=new int[4][2]

引用变量a 指向的对象是由int.class字节码生成的实例对象,在内存中只存在这么一份字节码。
引用变量c 指向的对象是由int[].class字节码生成的实例对象,在内存中也是只存在这么一份字节码。
两份不同的字节码,所占用的内存地址当然不同不会相等,自然编译器报错。




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