黑马程序员技术交流社区
标题:
求指教
[打印本页]
作者:
黑马张国礼
时间:
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
public class Person{
public String name;
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
Person p1 = new Person();
Field f = p1.getClass().getField("name");
String s = "this is a string";
System.out.println(f.getType());
System.out.println(s.getClass()==f.getType());
}
}
复制代码
输出
class java.lang.String
true
我理解为:往大了说,getType是返回Field的类型,即String类型,后面的s.getClass()也是返回类型的,也是String类型,故相等。
往小了说,这是在比较字节码,拿getType返回类型的字节码与getClass返回的类型的字节码。尽管内存里有多个String对象,但String类的字节码却是仅有独一无二的一份,在这里相当于基本数据类型的比较,故用==,最后还是相等。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2