class Person 
{
  String name; 
  int age;      Person(String n, int a)
  { name = n;  age = a;  }
  
  public boolean equals(Object obj)
   Person ps=null;
  
   if(obj instanceof Person)
   ps=(Person)obj;
   else
   return false;
  
   if(name.equals(ps.name) && age==ps.age)
   return true;
   else
   return false;
  }
  
}
class EqualsDemo 
{
  public static void main(String args[]) 
  {
    Person p=new Person("John",20);
    Person q=new Person("John",20);
    Person r=new Person("John",18);
    
    System.out.println(p==q);
    if(p.equals(q))
    System.out.println("p=q");
else
     System.out.println("p!=q");
    
    if(p.equals(r))
    System.out.println("p=r");
else
     System.out.println("p!=r");
  }
}我觉得输出结果应该是:
false
p=q
p!=r
但是实际输出结果是:
false
p!=q
p!=r

解决方案 »

  1.   

    我运行了,结果是如你所想的. 你的equals方法后面的"{" 哪里去了?
      

  2.   

    instance of是用于判断此类的机器码的,不只是用于判断内容
      

  3.   

    在Java中所有非基本类型都被作为对象,所以Person p=new Person("John",20); Person q=new Person("John",20);这样定义的两个对象会被认为不等。为什么这样:
        if(p.equals(q))
        System.out.println("p=q");
    else
         System.out.println("p!=q");
    会被认为不等,我就不明白了,我执行了一下你的代码输出结果为:
    false
    p=q
    p!=r
      

  4.   

    这里instanceof的用法是对的.
    或者可以写成:
      public boolean equals(Object obj) {
         try {
           Person p = (Person)obj;
           return (name == p.name || name.equals(p.name)) // in case name is null
                && age == p.age;
         }catch(Exception e) {
           return false;
         }
      }
      

  5.   

    我没有运行你实际的代码,但是感觉运行结果也应该是:
    false
    p=q
    p!=r但是我感觉你的equals方法应该再加上
    if (obj == null) 
     return false;会更好
      

  6.   

    D:\>javac EqualsDemo.javaD:\>java EqualsDemo
    false
    p=q
    p!=r
    --可能你的代码中:
      public boolean equals(Object obj)       //此处确实 少了个{ 请核对一下.
       Person ps=null;
      
       if(obj instanceof Person)
       ps=(Person)obj;
       else
       return false;
      
       if(name.equals(ps.name) && age==ps.age)
       return true;
       else
       return false;
      }