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。这是为什么啊?
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。这是为什么啊?
解决方案 »
- 重复运行同一个java程序,需要复制多份程序到不同文件夹吗?
- 【求助 】用jdeveloper出现404问题怎么解决?
- 简单数据岛显示
- 关于使用java正则表达式格式化html文档
- 请高手进
- 关于jar和配置文件的路径的问题,请高手解答,200分献上。
- 我用JCreator编写了桌面应用程序,但是每次想运行时都要从新编译。请问各位大哥:怎样制作出一个本地可执行的java程序?JCreator不能做么
- 为何这个程序输入的三个数据只能是n1<n1<n3才可以比较,否则就不可以比较大小;急
- 最简单的JAVA小程序不会运行,马上结帖!
- win7的32系统能装java吗,能装的话,是下载哪个版本
- 一个正则表达式的问题
- 关于接口的一点疑惑
return this.radius==((Circle)circle).radius;
所有类本来就是 Object的子类,所以强制转换后对象是 Circle 类的对象,
返回 true 是正确的
如果楼主想测试覆盖方法的话两个参数应该选不同类型的......
如:
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方法。
程序:
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
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方法.