标签:
首先为什么要重写equals方法呢?
这可能是我们比较关心的一个问题.
我个人的理解是,因为java Object类中自带的equals方法可能往往功能不够用.
所以我们需要重写他,给他自定义一些功能或者说是拿去特定的地方去用.
比如说我们要比较两个对象中的是否相同.我们就要拿这2个对象中的属性是否相同.
但是Object类中提供的方法没有提供这样的功能,所以我们这个时候就需要重写.
我们来看下例子(附带一些本人的理解,只做参考,欢迎批评指正.)
1 public class EqualsOverride { 2 3 public static void main(String[] args) { 4 Person p1 = new Person(11,"小明"); 5 Person p2 = new Person(11,"小明"); 6 boolean flag = p1.equals(p2); 7 if(flag) { 8 System.out.println("p1和p2相等"); 9 }else System.out.println("p1和p2不相等"); 10 } 11 12 } 13 class Person { 14 int age; 15 String name; 16 public Person(int age,String name) { 17 this.age = age; 18 this.name = name; 19 } 20 public int getAge() { 21 return age; 22 } 23 public void setAge(int age) { 24 this.age = age; 25 } 26 public String getName() { 27 return name; 28 } 29 public void setName(String name) { 30 this.name = name; 31 } 32 33 @Override 34 public boolean equals(Object obj) { 35 if(this == obj) {//如果是同一个对象 36 return true; 37 } 38 if(obj == null) {//如果传递过来的参数为空则返回空,因为对象和一个空的对象对比,就没有意义 39 return false; 40 } 41 if(obj instanceof Person){//如果参数的引用类型属于Person类 42 Person p = (Person)obj; 43 //就向下转型,我们知道,多态的前提是父类的引用指向子类的对象,而且一旦多态,子类的属性和子类特有的方法就暂时被屏蔽了. 44 //所以我们要想访问子类的属性就需要向下转型.因为Object是所有类的父类,所以传给obj这个形参的引用也是属于Objece这个类的引用,只不过是指向Person的对象 45 //而已.然后呢我们比较2个对象,实际上需要比较这2个对象的属性,就好比你比较两个人,会比较他们的年龄名字身高等等. 46 if(this.age == p.age && this.name.equals(p.name)) { 47 //这里的this就代表当前的对象,就是指的p1.equals(p2)中的p1,这个p2就当做参数传递给obj. 48 //因为age我们定义的是整数型,所以直接==判断即可,name是String类型,因为String类型比较的话,只能比较内容,不能用==,String类型用==去比较,是比较的内存 49 //地址值,不是内容值,然后String中也有个重写后的equals方法,所以我们直接拿来调用然后和另一个对象的name比较就可以.再然后就是短路与了,条件是左右两边都 50 //为真才返回真. 51 return true; 52 } 53 }return false; 54 } 55 }
标签:
原文地址:http://www.cnblogs.com/aL0n4k/p/4777333.html