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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐鑫 中级黑马   /  2012-4-21 01:54  /  3632 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐鑫 于 2012-4-21 21:53 编辑

请看代码注释部分            
我想问的是注释带?的地方,请看清问题,是编译报错,不是运行后结果!!!!
//数组与object的关系及其反射类型
        int [] a1 = new int[]{4,2};
        int [] a2 = new int[4];
        int [][]a3 = new int [2][3];
        String [] a4 = new String []{"e","a","g","d"};
        
        System.out.println(a1.getClass() == a2.getClass());//(int)类型相同,(一维数组)维度相同则数组的字节码相同
//        System.out.println(a1.getClass() == a3.getClass()); 这里编译不通过是因为多维数组没有字节码?
//        System.out.println(a1.getClass() == a4.getClass());为什么 编译不通过?
        System.out.println(a1.getClass().getSuperclass().getName());
如果是因为类型不同的话,他们不是class类型比较么?

12 个回复

倒序浏览
        System.out.println(a1.getClass() == a3.getClass());  class类的表现形式是字节码,二维int型和一维int型的字节码不同,直接在编译器就报错了
       System.out.println(a1.getClass() == a4.getClass());                                         一维int和一维string字节码也是不同的。如果换成int就true了
        System.out.println(a1.getClass().getSuperclass().getName());

点评

字节码不同就报错?反过来想一想,那我只能用相同的字节码比较?那比较它们还有什么意义?我都知道它们是相同的了  发表于 2012-4-21 11:38

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
老张讲课的时候是可以通过的,估计版本不同的问题,我使用1.7的话,也没有通过,编译器直接报错,
因为  System.out.println(a1.getClass() == a3.getClass()); 多维数组和一维数组字节码是不同的
System.out.println(a1.getClass() == a4.getClass());int数组和String数组的字节码也是不同的。

点评

字节码不同就报错?反过来想一想,那我只能用相同的字节码比较?那比较它们还有什么意义?我都知道它们是相同的了  发表于 2012-4-21 11:38

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
System.out.println(a1.getClass() == a3.getClass()); 数组类型相同,但是维数不同,可以将a3看成元素内容为数组的一维数组,而a1的元素为int型基本数据的一维数组,他们的字节码肯定不同了。
System.out.println(a1.getClass() == a4.getClass());数组类型不同,字节码自然也不同了。
它们比较的是字节码
回复 使用道具 举报
你们回答的有点跑题了吧。。。我问的是为什么编译不过,你们回答的是运行之后是true还是false!我注释里写的是编译报错!!!!请大家看清问题!!!
1楼和2楼的回答重复了我的问题!他们都是class类型,字节码不同就直接报错???那字符串“abc”==“xyz”也会编译报错???肯定不会啊!难道是字节码比较特殊?
请求帮助{:soso_e132:}
回复 使用道具 举报
毕博 发表于 2012-4-21 07:51
System.out.println(a1.getClass() == a3.getClass());  class类的表现形式是字节码,二维int型和 ...

字节码不同就报错,那“abc”与“xyz”也不同,他们用==比较也报错?显然不是
回复 使用道具 举报
1.数组与object的关系,可以这么理解,就是所有数组都是类,而object是所有类的父类。任何数组对象都可以赋值给object对象。
2.编译通不过,这样改一下应该可以了:
       System.out.println(a1.getClass() == (Class)a3.getClass()); //这里编译不通过是因为多维数组没有字节码?
        System.out.println(a1.getClass() == (Class)a4.getClass());//为什么 编译不通过?
用(Class)强制类型转换。

本来逻辑上编译是没问题的,我认为是jdk版本的问题。1.5之后的都没通过,是因为范型的原因(个人的理解),我这样判断的依据是看jdk文档里Class的定义是:java.lang.Class<T>。经过测试发现这个(Class)强制转换只要加了就行,不论你加在哪个(a1或a3,a4)身上都行,估计是编译器如果知道这个是Class类的对象的操作估计会特别对待,这就解释了为什么加在谁身上都行了。
一开始编译通不过是因为把它当作了普通的范型对象的操作了,后来加了(Class),编译器一旦知道这些是与Class有关的操作就不会把它当作普通的范型对待了。

另外加一些个人对数组和范型的理解有助于支持我上面做出的分析:
数组:
开发人员要定义什么样的数组编译器不知道,所以每定义一个新数组(判断数组的不同是通过维度或元素类型),编译器会自动产生一个新的类。
范型:
范型的机制,编译器在遇到范型对象时是会用object类型替换,然后如果需要会把对象通过强制类型转换转换为对应的类。而且好像跟数组一样对于Class<T>这样的范型,对于不同的T可能(真的只是可能,如非必要相信编译器不对吃多了多产生一个类)也会产生新的类。
回复 使用道具 举报
编译器(“==”是编译时期)可以查找冗余的代码,两个字节码不是可比类型,就报错了
回复 使用道具 举报
徐鑫 发表于 2012-4-21 11:35
字节码不同就报错,那“abc”与“xyz”也不同,他们用==比较也报错?显然不是 ...

“abc”和“xyz”都是字符串,他们在内存中的字节码是一样的
回复 使用道具 举报
yuanshilieshou 发表于 2012-4-21 18:59
“abc”和“xyz”都是字符串,他们在内存中的字节码是一样的

字节码不就是Class类型么??难道他们还有String,Integer...这些类型?
回复 使用道具 举报
都是Class,但数组和String有自己的字节码
回复 使用道具 举报
yuanshilieshou 发表于 2012-4-21 21:47
都是Class,但数组和String有自己的字节码

好的,我明白了,谢谢回答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马