日期:2014-05-20  浏览次数:20721 次

求教java中一个方法覆盖的问题!!!
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。这是为什么啊?

------解决方案--------------------
除非circle1,circle2 都定义成Circle类型的,否则根本不调用 equals(Circle circle) 这个方法
------解决方案--------------------
不奇怪,楼主你这里是强制转换
return this.radius==((Circle)circle).radius;
所有类本来就是 Object的子类,所以强制转换后对象是 Circle 类的对象,
返回 true 是正确的
如果楼主想测试覆盖方法的话两个参数应该选不同类型的......
------解决方案--------------------
在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方法。


------解决方案--------------------
试一下 下面的程序通过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方法)