public class Test {
  public static void main(String[] args) {
    Object circle1 = new Circle();
    Object circle2 = new Circle();
    System.out.println(circle1.equals(circle2));
  }
}class Circle {
  double radius;  public boolean equals(Circle circle) {
    return this.radius == circle.radius;
  }  public boolean equals(Object circle) {
     return this.radius==((Circle)circle).radius;
  }
}
请问大家:
我调用第一个equals结果是false,第二个equals结果是true。这是为什么啊?

解决方案 »

  1.   

    我试过了,两次结果都是TRUE;楼主说的我就想不通了!
      

  2.   

    除非circle1,circle2 都定义成Circle类型的,否则根本不调用 equals(Circle circle) 这个方法
      

  3.   

    不奇怪,楼主你这里是强制转换
     return this.radius==((Circle)circle).radius;
    所有类本来就是 Object的子类,所以强制转换后对象是 Circle 类的对象,
    返回 true 是正确的
    如果楼主想测试覆盖方法的话两个参数应该选不同类型的......
      

  4.   

    我运行eclipse结果为false true。它们的radius怎么会相等啊?
      

  5.   

    呵呵,double 型的值可以用 == 比较相等??
      

  6.   

    在java里对象调用方法,采用动态绑定,即调用new出来的对象,而不是其引用
    如:
    class A1 {
    public void p() {
    System.out.println("p in a1");
    }
    }class B1 extends A1 {
    public void p() {
    System.out.println("");
    }
    }
    A1 a1 = new B1();
    B1 b1 = new B1();
    a1.p();
    b1.p();
    其结果都打印p in b1
    但是对其参数的调用不采用绑定机制,即不会根据子类的对象判定,而是根据本身判定,如:
    public class Test1 {
    public static void main(String[] args) {
    Object integer = new Integer(3);
    A1 a1 = new B1();
    B1 b1 = new B1();
    a1.p(integer);
    a1.p((Integer)integer);
    b1.p(integer);
    b1.p((Integer)integer);
    }
    }class A1 {
    public void p(Integer i) {
    System.out.println("pi in a1");
    }
    public void p(Object o) {
    System.out.println("po in a1");
    }
    }class B1 extends A1 {
    public void p(Object o) {
    System.out.println("po in b1");
    }
    public void p(Integer i) {
    System.out.println("pi in b1");
    }
    }
    结果为:
    po in b1
    pi in b1
    po in b1
    pi in b1
    因为在判断参数时,不会自动转型。回过头来看你这道题:
    你的参数是Object(因为不会自动转型为Circle),所以不会调用参数为Circle的方法。而你的对象是Circle类型(因为会自动转型为Circle),所以总会去调用Circle类的方法,故去调用你复写Object的equals方法。
      

  7.   

    语法我是知道,可是第二个为什么是true呢?两个对象开辟不同的内存,怎么会相等呢?
      

  8.   

    试一下 下面的程序通过System.out.println来跟踪打印
    程序:
    public class Test {
      public static void main(String[] args) {
        Object circle1 = new Circle();
        Object circle2 = new Circle();
        Circle circle3 = new Circle();
        Circle circle4 = new Circle();
        System.out.println(circle1.equals(circle2));
        System.out.println(circle3.equals(circle4));
        System.out.println(circle1.equals(circle3));
        System.out.println(circle3.equals(circle1));
      }
    } class Circle {
      double radius;   //equals方法从载
      public boolean equals(Circle circle) {
      System.out.println("user equals about Circle!");
        return this.radius == circle.radius;
      }   //equals方法覆盖(是覆盖父类Object的equals方法)
      public boolean equals(Object circle) {
      System.out.println("user equals about Object!");
         return this.radius==((Circle)circle).radius;
      }
    }输出:
    user equals about Object!
    true
    user equals about Circle!
    true
    user equals about Object!
    true
    user equals about Object!
    true
      

  9.   

    如果把
      public boolean equals(Circle circle) {
        return this.radius == circle.radius;
      }
    修改成
        public boolean equals(Circle circle) {
            System.out.println(this.radius);
            System.out.println(circle.radius);
            return this.radius == circle.radius;
        }你观察一下打印结果,是不是这个函数根本没有被执行?呵呵
    这个就是原因所在!打印false是因为直接调用了Object的equals方法.