我们来看一个这个例子
public void test() {
Student s = new Student(21,"张三",'男');
Student s1 = new Student(21,"张三",'男');
System.out.println(s==s1);
System.out.println(s.equals(s1));
System.out.println(s);
}
这样运行结果:
那么为什么都是false呢,我们解析一下
当判断s==s1时。它比较的是对象的引用,每new一个对象都开辟了一片内存,s和s1指向的是不同的内寸,引用的对象不一样,就指向的是不同对象的地址,所以判断为false。
当使用equals方法时,为什么还会错呢?因为它调用的是Object类的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
在equals方法中,用来比较的是两个对象的引用是否相等,即是否指向同一个对象。
本题我们指向的Student对象的两个不同引用,所以判断为false
一般我们为了避免这种情况,就重写equals方法,自己定义判断方法。
public boolean equals(Object obj) {
//instanceof判断是不是自己定义的类型
if(obj instanceof Student) {
Student s = (Student)obj;
if(this.id == s.getId()
&&
this.name.equals(s.getName())
&&
this.sex == s.getSex())
return true;
}
return false;
}
加了以上代码,就可以自己定义判断方法。
运行结果:
总结:
当对象使用==比较时,比较的是使用对象的地址
当用equals方法比较的时候,没有重写则比较的是引用类型所指向的地址。重写可以根据自己定义的equals方法比较。