黑马程序员技术交流社区

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

作者: 一直很安静    时间: 2013-11-15 11:22
标题: 数组的反射
int[] a1={2,3,4};
String[] a2={"a","b","c"};
System.out.println (a1.getClass()==a2.getClass());//为什么这句话会编译失败、提示操作数类型不兼容,可是视频里这样明明是能运行的
作者: 一步一脚印    时间: 2013-11-15 12:00
因为getClass()不能用于操作原始类型如(int ,double这样的)
要获得字节码有3种方式我一一给你列举
  1.         Class cls1 = int.getClass();//这样基本类型不能使用这种方法,所以会报错
  2.                 要想整型使用getClass,那你只能定义Integer这个对int的包装类来使用。
  3.                 Class cls2 = int.class;
  4.                 Class cls3 = String.getClass();
  5.                 Class cls4 = String.class;
  6.                 Class cls5 = Class.forName("java.lang.String");
复制代码
这个和数组没有直接关系,看的是类型。
但是在这之前你应该清楚知道为什么有Integer这些外覆型别的存在,因为诸如int/double/float这些基本型别不属于类,无法自身转换成String。所以String和Int直接不存在什么直接联系。
那为什么我们平时看到
int a =5;
String b = "0"+5;
可以转换,实际是在编译时系统会自动把a转换成和""一样的String,但是其在资源耗费上要相对大一些;
作者: linjl_ll    时间: 2013-11-15 13:05
楼主好,==比较的是2个变量对应的内存空间存放的值是否相同。要进行比较参与比较的2个变量他们得有可比较性啊。例如你让一个int类型的变量和boolean的变量进行比较这显然没有意义,他们存储的值肯定不一样。再例如:
class MM{};classNN{},此时MM m=new MM();NN n = new NN();n==m是错误的,此时这2个对象是完全不一样的东西,所以他们的地址是不可能相同的即n和m对应的内存存储的值是不可能相同的,没有比较性,我们把上面的代码修改下class MM  extends NN{};classNN{}
此时MM m=new MM();NN n = new NN();n==m;是能编译通过的,因为 NN类型的引用变量是有可能指向MM的对象的所以引用变量n和m是有可能相同的所以具有比较性。再看看你说的代码 a1.getClass()==a2.getClass();;a1.getClass()的类型是Class<?extends int[]> a2.getClass()是Class<?extends String[]>的,这2中东西是不可能同时共享一片内存的,即不存在一个东西既是Class<?extends int[]>类型的又是Class<?extends String[]>类型的。
把a1.getClass()==a2.getClass();这段代码改成:Class a1c = a1.getClass();Class a2c = a2.getClass();system.out.println(ac1=ac2);此时能编译通过
因为此时是Class和Class类型的引用变量在比较,它们有可能指向同一片内存所以具有比较性。
总之,比较的2个变量它要有可能相同,才具有比较性,如果肯定不相同的话那比较有什么意义。


作者: 一直很安静    时间: 2013-11-15 19:08
一步一脚印 发表于 2013-11-15 12:00
因为getClass()不能用于操作原始类型如(int ,double这样的)
要获得字节码有3种方式我一一给你列举这个 ...

我那不是基本类型 是数组啊
作者: 一直很安静    时间: 2013-11-15 19:09
linjl_ll 发表于 2013-11-15 13:05
楼主好,==比较的是2个变量对应的内存空间存放的值是否相同。要进行比较参与比较的2个变量他们得有可比较性 ...

可是看视频里老师写得是一样的
作者: linjl_ll    时间: 2013-11-15 19:54
一直很安静 发表于 2013-11-15 19:09
可是看视频里老师写得是一样的

可能myeclipse使用的版本不一样吧,有可能编译时采用的1.4的jdk。






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