黑马程序员技术交流社区

标题: 代码问题 [打印本页]

作者: 宋大人-专注    时间: 2014-6-10 10:21
标题: 代码问题
class Equalse{
        String name;
        int age;
}
public class ObjectDemo2{
        public static void main(String args[]){
                Equalse p=new Equalse();
                Equalse q=new Equalse();
                String st1=new String("abc");
                String st2=new String("abc");
                Equalse r=p;
                p.name="abc";
                p.age=12;
                q.name="abc";
                q.age=12;
       
                System.out.println(p.equals(q));
                System.out.println(st1.equals(st2));
                //怎么解释他们的输出结果,为什么会有不同的结果呀
        }
       
}
作者: 李彦来    时间: 2014-6-10 10:44
p和q都是Equalse的对象,在new的时候会在内存中开辟空间,

当你输出p或q的时候会是两个对象的内存地址,我这的输出是这样的:
P:Equalse@7c6a6484
q:Equalse@2ced55ec
equals()方法比较的是两个字符串的内容,当p和q两个对象变为字符串比较时,比较的是内存地址的字符串,必然不相等.
如果你输出的是 System.out.println((p.name).equals(q.name));
也就是两个对象的name属性时,输出的结果是true
作者: shisishishisi    时间: 2014-6-10 10:53
p.equals(q);是调用你的Equals类的equals方法,这个equals方法是从Object继承过来的,比较的是对象在内存中的地址值,你的p和q都是new出来的,所以为false
st1.equals(st2); 因为st1和st2都是String类型的对象,查看API可以知道String类对Object类的equals方法进行了复写,复写完之后比较的是两个对象的值是否相等,所以返回true

作者: 郝义涛    时间: 2014-6-10 11:01
equals对于字符串,比较的是两个字符串的内容,
对于对象,比较的是内存地址,不过你可以把Equalse的hashset()和equals()方法改了,既可
作者: yogaa    时间: 2014-6-10 12:59
本帖最后由 yogaa 于 2014-6-10 13:01 编辑

q和p是两个不同的对象,内存中存放的地址不一样,Equalse类的equals方法,会比较对象在内存中的地址值,所以返回值false;
而那个str1和str2由于都是String对象,String里重写了equals方法变为只比较字符串内容了,由于都是"abc"所以返回值true;

作者: wuguiye    时间: 2014-6-10 14:59
String 类中覆盖了equals 方法,比较的是字符串相不相等,而Equalse类中没有覆盖equals方法,比较的仍是对象的地址
作者: 马宁    时间: 2014-6-10 19:03
shisishishisi 发表于 2014-6-10 10:53
p.equals(q);是调用你的Equals类的equals方法,这个equals方法是从Object继承过来的,比较的是对象在内存中 ...

学习了,,,
作者: 相濡、彼岸    时间: 2014-6-10 20:07
本帖最后由 相濡、彼岸 于 2014-6-10 20:24 编辑

关键就是equals的问题,

System.out.println(p.equals(q)); 中 的 equals方法是继承了Obiect的equals方法,比较的是对象的地址值,显然p和q是俩个对象,所以地址值不同,所以为false。

System.out.println(st1.equals(st2)); 中 的 equals方法是String类里面的equals, String把Object里面的equals复写掉了,有了自己比较的方式,那就是比较字符串的内容是否相同,字符串一旦创建就不能被改变,创建第一个String st1=new String("abc");的时候,常量池中就有了“abc”,创建第2个 String st2=new String("abc");的时候,他会去常量池里面找,发现有“abc”,所以就不创建了,所以st1和st2指向了同样一个“abc”.



另外,字符串写成    String  st1 = "abc";       String  st2 = "abc";       就可以了。   “abc”就是一个具体的对象。


作者: 这个夏天的芬芳    时间: 2014-6-10 20:26
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: Wokno    时间: 2014-6-10 20:41
路过看看。。。。。。。。。。。。。
作者: 塔罗    时间: 2014-6-10 20:58
说的很好。。。

作者: 唐坚    时间: 2014-6-11 00:46
        受教了
作者: 飘渺≮★耘    时间: 2014-6-11 09:41
p与q是继承object的equals方法所以比较的是地址,false。st1与st2是String对象,String有重写object的equals方法,比较的是值,所以为true




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