问题描述
在java中由于Object是所有类的父类,而且equals方法是public,理论上所有Person类都能够继承并使用该方法。然而以下程序执行结果是false。```classPerson//定义了Person类,实际就是继承了Object类{privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}}publicclassTestObject{publicstaticvoidmain(String[]args){Personper1=newPerson("Tyrion",24);Personper2=newPerson("Tyrion",24);System.out.println(per1.equals(per2));}}```但是将程序修改,用Object接收类,结果为true。请大家帮帮忙```classPerson//定义了Person类,实际就是继承了Object类{privateStringname;privateintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}}publicclassTestObject{publicstaticvoidmain(String[]args){Personper1=newPerson("Tyrion",24);Personper2=newPerson("Tyrion",34);Objectobj1=per1;Objectobj2=per2;System.out.println(obj1.equals(per1));}}```看过jdk文档,并没有明确说明。请大家帮忙解答。
解决方案
解决方案二:
1、用object应该也是不相等的这边应该是System.out.println(obj1.equals(obj2));如果这样不是同一个对象吗System.out.println(obj1.equals(per1));如果你要比较两个对象,比如Person,那你应该是重写equals方法
解决方案三:
我的子类并不想覆写Object类的方法,System.out.println(per1.equals(per2));它难道不能区分吗?从逻辑上,子类可以引用父类的方法,且传递的参数可以向上传递。从逻辑上,应该是true
解决方案四:
文档:Object类的equals方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值x和y,当且仅当x和y引用同一个对象时,此方法才返回true(x==y具有值true)。第一个例子Person继承equals方法,没有重写,所以还是比较对象的引用是否相同,-->相同为true,不相同falsep1,p2都是new创建的,在堆分配两块不同的空间,所以false第二个例子obj1.equals(per1),比较的是obj1和per1,Objectobj1=per1;传递时把per1的值传递给obj1,所以两个对象指向同一块空间,返回true;
解决方案五:
看懂了,看来Object类中equals方法还真是要覆写才好用。不覆写比较的是内存空间的地址。
解决方案六:
不覆盖比较也不是内存地址,是hashcode
解决方案七:
文档:如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。classPerson//定义了Person类,实际就是继承了Object类{privateStringname;privateintage;publicinthashCode(){return1;}publicPerson(Stringname,intage){this.name=name;this.age=age;}}publicclassTestObject{publicstaticvoidmain(String[]args){Personper1=newPerson("Tyrion",24);Personper2=newPerson("Tyrion",24);System.out.println(per1.equals(per2));}}
返回false,应该比较的是内存地址吧
解决方案八:
Object默认的equals方法比较的是内存地址,必须指向同一个地方才会返回true.
解决方案九:
首先我和你说,你没重写方法,当然可以直接调用obj的eq方法,但是你比较的是什么?你应该比较的是对象,第一种情况你搞出两个对象,那能一样么?你首先要看一下obj的eq方法默认比较的是什么玩意,对不对?再说了,你二种情况,你把一个对象的地址传递给另外一个引用,你拿着同一个对象的两个引用在那比,它能不输出true么?
解决方案十:
在Person重写Object的equals方法publicvoidequals(Objecto){if(oinstanceofPerson)}Personp=(Person)o;returnthis.name.equals(p.name)&&this.age==p.age;}}
解决方案十一:
第二段代码写错了。System.out.println(obj1.equals(per2));都是不等。
解决方案十二:
楼主没写重写equlas方法,Object默认拿==去判断,new了两个对象,肯定不相等;付源码清晰明了publicbooleanequals(ObjectanObject){if(this==anObject){returntrue;}if(anObjectinstanceofString){StringanotherString=(String)anObject;intn=value.length;if(n==anotherString.value.length){charv1[]=value;charv2[]=anotherString.value;inti=0;while(n--!=0){if(v1[i]!=v2[i])returnfalse;i++;}returntrue;}}returnfalse;}
解决方案十三:
第一个比较的是hashcode的值,第二个比较的是ob持有的person对象的引用,