A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 祁焱 黑马帝   /  2011-11-6 20:31  /  1470 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                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);
为什么以上代码注释处通不过编译,修改后就可以正常运行了,修改前的比较和修改好的比较有什么本质不同吗?

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
相同类型,相同维数的数组的字节码是相同的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

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
java分编译时和运行时
你修改后:
Class cls1=a1.getClass();
Class cls2=a3.getClass();
Class cls3=a3.getClass();
这时候只检查赋值的左边,到运行的时候才会确定类型的当然会编译通过了,
多看看编译时多态和运行时多态
而通过“==”在编译时会严格件检查编译类型的所以编译不会通过了

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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里面存的都是类型类,相同,所有可以编译

评分

参与人数 1技术分 +2 收起 理由
宁超 + 2 赞一个!

查看全部评分

回复 使用道具 举报
嘿嘿,因为System.out.println(a1.getClass()==a3.getClass())是一维数组在比较,可以编译通过,而System.out.println(a1.getClass()==a3.getClass())是一维和二维数组比较,类型不同,编译不会通过。修改后比较的应该是各自的类名,类型相同,编译可以通过

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马