黑马程序员技术交流社区

标题: 类型匹配问题 [打印本页]

作者: 祁焱    时间: 2011-11-6 20:31
标题: 类型匹配问题
                int[] a1=new int[3];
                int[] a2=new int[4];
                int[][] a3=new int[3][4];
                   System.out.println(a1.getClass()==a2.getClass());
                  System.out.println(a1.getClass()==a3.getClass());//通不过编译
                 System.out.println(a1.getClass()==a4.getClass());//通不过编译

                  修改后:
                 Class cls1=a1.getClass();
                 Class cls2=a3.getClass();
                 Class cls3=a3.getClass();
                 System.out.println(cls1==cls2);
                System.out.println(cls1==cls3);
为什么以上代码注释处通不过编译,修改后就可以正常运行了,修改前的比较和修改好的比较有什么本质不同吗?


作者: 高美云    时间: 2011-11-6 20:40
嘿嘿,因为System.out.println(a1.getClass()==a3.getClass())是一维数组在比较,可以编译通过,而System.out.println(a1.getClass()==a3.getClass())是一维和二维数组比较,类型不同,编译不会通过。修改后比较的应该是各自的类名,类型相同,编译可以通过
作者: 王赫麟    时间: 2011-11-7 16:02
System.out.println(a1.getClass()==a2.getClass());可以通过变异没问题,因为是两个一惟数组比较。
                  System.out.println(a1.getClass()==a3.getClass());a1是一位数组,a3是二位数组,类型不同无法比较。
                 System.out.println(a1.getClass()==a4.getClass());这个原因同上。
修改后,cls1,cls2,cls3里面存的都是类型类,相同,所有可以编译
作者: 崔浩    时间: 2011-11-7 21:44
java分编译时和运行时
你修改后:
Class cls1=a1.getClass();
Class cls2=a3.getClass();
Class cls3=a3.getClass();
这时候只检查赋值的左边,到运行的时候才会确定类型的当然会编译通过了,
多看看编译时多态和运行时多态
而通过“==”在编译时会严格件检查编译类型的所以编译不会通过了

作者: 史晓霞    时间: 2011-11-7 23:02
相同类型,相同维数的数组的字节码是相同的a1.getClass()==a3.getClass()是维数不相同应该是false,而a1.getClass()==a4.getClass()我没有看到你定义的a4是什么,而 Class cls1=a1.getClass();
           Class cls2=a3.getClass();
           Class cls3=a3.getClass();都是Class类 System.out.println(cls1==cls2);
          System.out.println(cls1==cls3);返回只是false




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