主类public class Test{
   public static void main(String[]args){
Object circle = new Circle();
Object circle2 = new Circle();
System.out.println(circle.equals(circle2));
}
}
当Circle类是
class Circle{
private int x;
public boolean equals(Object circle){
return this.x == ((Circle)circle).x;
}
}时,控制台输出true
但是,Circle类为
class Circle{
private int x;
public boolean equals(Circle circle){
return this.x == circle.x;
}
}时,控制台输出false
为什么第二个会输出false,我是初学者,希望大侠相助~~

解决方案 »

  1.   

    Object circle = new Circle();
    Object circle2 = new Circle();
    public boolean equals(Circle circle){
    return this.x == circle.x;
    }对象类型不匹配
      

  2.   

    public boolean equals(Circle circle){
    return this.x == circle.x;
    }
    刚才用myEclipse、debug走了两边才发现这个方法根本不进去。加了个@Override才发现程序报错了。这个方法只能算作是用户自定义一个和object类同名的方法。实际并不是对object类中equals方法的重写,当使用时会调用object类的equals方法。第一个,你重写了equals方法 是比较 只要x相等就返回true第二个,你没重写equals方法 是比较 两个引用是否指向同一对象 , 你new了2次生成两个对象, 当然false
      

  3.   

    这样的问题, 自己debug看下, 慢慢来 就能找到问题所在了
      

  4.   

    Object circle = new Circle();
    Object circle2 = new Circle();
    public boolean equals(Object circle){
    return this.x == ((Circle)circle).x;
    }第一个是:   传入的是object的对象,在equals的时候,来了个强制类型的转换public boolean equals(Circle circle){
    return this.x == circle.x;
    }第二个是:  传入的是 Circle的对象,直接赋值,false的原因就是: 对象的类型不匹配
      

  5.   

    是因为重载了equals,而不是重写
      

  6.   

    第一个是重写,覆盖了Object的equals方法,第二个重载Object的方法,所以第二equals用得方法是Object的方法,所以是false了。
      

  7.   

    楼主在equals()方法里加一输出,看得很清楚!
      

  8.   

    你确定这样没报错吗?x是private的,怎么能点出来?
      

  9.   

    就算是重载,也会优先调用被重载的方法,因为circle是Circle类型的
      

  10.   

    错了,circle是Object,懂了,确实
      

  11.   

    在比较两个对象是否相等的时候,覆写equals()方法的同时 还要覆写hashcode()方法,你将hashcode()方法覆写之后,再看结果(参考Object类的hashcode())
    若是在集合之中比较,则类要实现Comparable接口并实现compareTo()方法。
      

  12.   


    主类public class Test{
      public static void main(String[]args){
    Object circle = new Circle();
    Object circle2 = new Circle();
    System.out.println(circle.equals(circle2));
    }
    }
    当Circle类是
    class Circle{
    private int x;
    public boolean equals(Object circle){
    return this.x == ((Circle)circle).x;
    } 你这样写,其实还是在调用Object类的equals方法
    在API中是这样说的:public boolean equals(Object obj)
    此时,你的equals并没有实现对Object的覆写
    当你这样写的时候,就是覆写。而覆写equals()必须要覆写hashcode()。所以会出现false。
    public boolean equals(Circle circle){
    return this.x == circle.x;
    }
      

  13.   

    第一个是重写,覆盖了Object的equals方法,第二个重载Object的方法,所以第二equals用得方法是Object的方法,所以是false了。 
      

  14.   

    楼主看明白下面的代码,你就基本明白了,关键点都写好注释了
    public static void main(String[]args){
        Object circle = new Circle();
        Object circle2 = new Circle();
        System.out.println(circle.equals(circle2));
        System.out.println(circle.equals((Circle)circle2)); //强制转换为Circle类型
    }class Circle{
        private int x;
        //参数是object类型
        public boolean equals(Object circle){
            return this.x == circle.x;
        }
        //参数是Circle类型
        public boolean equals(Circle circle){
            return this.x == ((Circle)circle).x;
        }
    }
      

  15.   

    import java.util.*;
    public class BasicContainer {
    public static void main(String args[]) {
    Collection c = new HashSet();
    Name n = new Name("ye","dame");
    Name m = new Name("ye","dame");
    c.add(n);
    System.out.println(c.remove(m));
    System.out.println(c);
    }
    }class Name{
    String firstname;
    String secondname;

    Name(String firstname,String secondname) {
    this.secondname = secondname;
    this.firstname = firstname;
    }

    public boolean equals(Name n) {
    return (this.secondname.equals(n.secondname)) && (this.firstname.equals(n.firstname));

    }
    public int hashCode() {
    return firstname.hashCode();
    }
    }
    还是不行,我已经改了参数类型了还是返回了false怎么搞
      

  16.   

    第一个是重写,覆盖了Object的equals方法,第二个重载Object的方法,所以第二equals用得方法是Object的方法,所以是false了。
      

  17.   

    不错,蛮有意思的。不过,我一直没有遇到这样的问题,如果需要Override方法,直接使用eclipse,右击->source->Implement or Override method。呵呵~~