A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© て淡莣了陌生 中级黑马   /  2013-4-26 11:34  /  1579 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 て淡莣了陌生 于 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;
        }

}
这段代码编译的时候没有问题,为什么运行的时候会报错的,哪路大神指教一下,谢谢!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
这段代码编译的时候很有问题的,正解代码如下:
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;
         }

}
这才是完整的代码,编译和运行都没问题
回复 使用道具 举报
楼上分析的很对。。
下次遇到问题先找找看是不是因为手误。然后再向别人求助吧
回复 使用道具 举报
楼主,你的代码在编译的时候好像就有问题啊。。
一个是新建一个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值
回复 使用道具 举报
补充楼上:
1.在这种环境下,显然是new两个Person类,equals方法中的内容过于啰嗦,不精简,我写了个代码,你参考下。
2.既然楼主想复写equals方法,让id相同时就认为是同一个对象,那new对象的时候就给对象初始化id。
3.缕清obj instanceof Person的意思:判断obj引用指向的对象是否是Person类的实例化对象。
4.多态中,父类引用想调用子类方法,必须把引用类型降低为该类类型的引用。
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.     {
  5.                
  6.                 Person p1=new Person(2);
  7.         
  8.                 Person p2=new Person(3);        

  9.                 System.out.println(p1.equals(p2));
  10.      }
  11. }

  12. class Person
  13. {
  14.         private int id;
  15.         Person(int id)
  16.         {
  17.                 this.id=id;
  18.         }

  19.     public boolean equals(Object obj)
  20.         {               
  21.         if(!(obj instanceof Person))
  22.                        
  23.                         return false;
  24.                         Person p = (Person)obj;
  25.                         return this.id==p.id;
  26.         }
  27. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马