黑马程序员技术交流社区
标题:
equals()方法问题
[打印本页]
作者:
て淡莣了陌生
时间:
2013-4-26 11:34
标题:
equals()方法问题
本帖最后由 て淡莣了陌生 于 2013-4-26 14:51 编辑
class Demo2
{
public static void main(String[] args)
{
Person p1=new Person();
Person p2=new Person;
System.out.println(p1.equals(p2));
}
}
class Person
{
int id;
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj instanceof Person){
return this.id==obj.id;
}
return false;
}
}
这段代码编译的时候没有问题,为什么运行的时候会报错的,哪路大神指教一下,谢谢!
作者:
吴波
时间:
2013-4-26 11:51
这段代码编译的时候很有问题的,正解代码如下:
class TestDemo
{
public static void main(String[] args)
{
Person p1=new Person();
Person p2=new Person(); //因为是对象初始化,后面要加()
System.out.println(p1.equals(p2));
}
}
class Person
{
int id;
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj instanceof Person){
Person pe=(Person)obj;//判断是同类后,要强转obj
return this.id==pe.id;//要记住这里要改为强转后的对象.id
}
return false;
}
}
这才是完整的代码,编译和运行都没问题
作者:
932759732
时间:
2013-4-26 11:57
楼上分析的很对。。
下次遇到问题先找找看是不是因为手误。然后再向别人求助吧
作者:
bianbian18
时间:
2013-4-26 12:28
楼主,你的代码在编译的时候好像就有问题啊。。
一个是新建一个Person对象的时候,一个是obj.id这里。
新建的时候只是把括号写掉了Person p2=new Person(); 。
而通过obj对id属性的引用,obj没有强转成Person的对象,怎么能够引用呢。
if (obj instanceof Person) {
return this.id == ((Person)obj).id;
}
因为你重写了equlas方法,根据你的逻辑不再是比较两个对象的地址值,而是先比较地址,再比较id值!
两个对象的地址值不相等,但是他们的ID值是相等的,所以这段代码如果编译正确,运行的时候应该返回true值
作者:
聖手`书生
时间:
2013-4-26 13:14
补充楼上:
1.在这种环境下,显然是new两个Person类,equals方法中的内容过于啰嗦,不精简,我写了个代码,你参考下。
2.既然楼主想复写equals方法,让id相同时就认为是同一个对象,那new对象的时候就给对象初始化id。
3.缕清obj instanceof Person的意思:判断obj引用指向的对象是否是Person类的实例化对象。
4.多态中,父类引用想调用子类方法,必须把引用类型降低为该类类型的引用。
class Demo
{
public static void main(String[] args)
{
Person p1=new Person(2);
Person p2=new Person(3);
System.out.println(p1.equals(p2));
}
}
class Person
{
private int id;
Person(int id)
{
this.id=id;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.id==p.id;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2