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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张国礼 初级黑马   /  2012-6-8 08:09  /  1241 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么字节码的比较要用等号来比较?
        if(field.getType()==String.class)
        if(field.getType().equals(String.class))
        张老师在视频中讲到因为是同一份字节码,还是不太明白啊?
        希望各位高手能给俺透彻的讲解一下啦?

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 欢迎新学员!加油!!!

查看全部评分

4 个回复

倒序浏览
一个类字节码 只有一个  对象可能会有很多个  但是我们比较的是字节码也就是比较是不是同一个类 例如“abc”.equals"ab" 就是false String.class=="abc".getClass() 就是true 这里我们比较的是字节码不是对象 所以用==更专业  用equals也可以
回复 使用道具 举报
本帖最后由 刘克方 于 2012-6-8 08:54 编辑

Class类的父类是Object类,而Class类没有复写父类的equals方法;那么它的==比较与equals()方法是完全一样的,因为Object类的equals方法实现为
public boolean equals(Object obj){
return this==obj;
}
这些你在源码中可以看到;
==比较的是内存地址,因为内存中只有一份字节码;所以同一个类的所有对有对象的字节码用==比较返回值为true
回复 使用道具 举报
刘克方 发表于 2012-6-8 08:53
Class类的父类是Object类,而Class类没有复写父类的equals方法;那么它的==比较与equals()方法是完全一样 ...

嗯,受教啦,嘿嘿,说的很透彻啊
回复 使用道具 举报
  1. public class Person{
  2.         public String name;
  3.         public static void main(String[] args) throws SecurityException, NoSuchFieldException {
  4.                 Person p1 = new Person();
  5.                 Field f = p1.getClass().getField("name");
  6.                 String s = "this is a string";
  7.                 System.out.println(f.getType());
  8.                 System.out.println(s.getClass()==f.getType());
  9.         }
  10. }
复制代码
输出
class java.lang.String
true
我理解为:往大了说,getType是返回Field的类型,即String类型,后面的s.getClass()也是返回类型的,也是String类型,故相等。
往小了说,这是在比较字节码,拿getType返回类型的字节码与getClass返回的类型的字节码。尽管内存里有多个String对象,但String类的字节码却是仅有独一无二的一份,在这里相当于基本数据类型的比较,故用==,最后还是相等。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马