黑马程序员技术交流社区

标题: 求指教 [打印本页]

作者: 黑马张国礼    时间: 2012-6-8 08:09
标题: 求指教
为什么字节码的比较要用等号来比较?
        if(field.getType()==String.class)
        if(field.getType().equals(String.class))
        张老师在视频中讲到因为是同一份字节码,还是不太明白啊?
        希望各位高手能给俺透彻的讲解一下啦?
作者: 姚玉鹏    时间: 2012-6-8 08:20
一个类字节码 只有一个  对象可能会有很多个  但是我们比较的是字节码也就是比较是不是同一个类 例如“abc”.equals"ab" 就是false String.class=="abc".getClass() 就是true 这里我们比较的是字节码不是对象 所以用==更专业  用equals也可以
作者: 刘克方    时间: 2012-6-8 08:53
本帖最后由 刘克方 于 2012-6-8 08:54 编辑

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

嗯,受教啦,嘿嘿,说的很透彻啊
作者: 赵兵锋    时间: 2012-6-8 09:30
  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类的字节码却是仅有独一无二的一份,在这里相当于基本数据类型的比较,故用==,最后还是相等。




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