覆盖 equals() 方法
Overriding the equals() method
class Deneme{
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;
}
}
和
class Deneme{
public static void main(String[] args) {
Object circle1 = new Circle();
Object circle2 = new Circle();
System.out.println(circle1.equals(circle2));
}
}
class Circle{
double radius;
@Override
public boolean equals(Object circle) {
return this.radius == ((Circle)circle).radius;
}
}
我对这些代码有疑问。我有两个问题。首先,在第一个例子中我知道 equals() 没有被覆盖。在 main 方法中,我创建了 circle1 和 circle2 对象,它们的声明类型是对象。然后我们调用 equals() 方法,但 equals() 方法只接受声明类型为 Circle 的参数。怎么可能?代码 运行ning 没有任何问题。
其次,当我尝试 运行 代码时,我在第一个示例中得到了 "false",在控制台中得到了第二个示例中的 "true"。你能解释一下这些代码背后的逻辑吗?我们想在这里证明什么?当我将 equals() 方法的签名从 Circle circle 更改为 Object circle 时发生了什么变化?
第一个甚至没有调用您的方法,因为您传递的对象类型作为引用与您的方法签名不匹配,而是使用对象的 equals。
你可以试试这个来理解:
class Circle{
double radius;
public boolean equals(Circle circle) {
System.out.println("This is not getting invoked");
return this.radius == circle.radius;
}
}
在第一个例子中,你overloaded方法,
对于覆盖,您必须保存 equals 方法的原始签名,如第二个示例。
重写 equals 时尝试以下操作。有必要检查空值和不正确的类型以防止 NPE's
和 casting exceptions
.
class Circle{
double radius;
@Override
public int hashCode() {
return Double.valueOf(radius).hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Circle) {
Circle circle = (Circle)obj;
return this.radius == circle.radius;
}
return false;
}
}
要记住的要点是 equals 方法的类型是 Object
,而不是你的 class type
.
class Deneme{
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;
}
}
和
class Deneme{
public static void main(String[] args) {
Object circle1 = new Circle();
Object circle2 = new Circle();
System.out.println(circle1.equals(circle2));
}
}
class Circle{
double radius;
@Override
public boolean equals(Object circle) {
return this.radius == ((Circle)circle).radius;
}
}
我对这些代码有疑问。我有两个问题。首先,在第一个例子中我知道 equals() 没有被覆盖。在 main 方法中,我创建了 circle1 和 circle2 对象,它们的声明类型是对象。然后我们调用 equals() 方法,但 equals() 方法只接受声明类型为 Circle 的参数。怎么可能?代码 运行ning 没有任何问题。
其次,当我尝试 运行 代码时,我在第一个示例中得到了 "false",在控制台中得到了第二个示例中的 "true"。你能解释一下这些代码背后的逻辑吗?我们想在这里证明什么?当我将 equals() 方法的签名从 Circle circle 更改为 Object circle 时发生了什么变化?
第一个甚至没有调用您的方法,因为您传递的对象类型作为引用与您的方法签名不匹配,而是使用对象的 equals。
你可以试试这个来理解:
class Circle{
double radius;
public boolean equals(Circle circle) {
System.out.println("This is not getting invoked");
return this.radius == circle.radius;
}
}
在第一个例子中,你overloaded方法, 对于覆盖,您必须保存 equals 方法的原始签名,如第二个示例。
重写 equals 时尝试以下操作。有必要检查空值和不正确的类型以防止 NPE's
和 casting exceptions
.
class Circle{
double radius;
@Override
public int hashCode() {
return Double.valueOf(radius).hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Circle) {
Circle circle = (Circle)obj;
return this.radius == circle.radius;
}
return false;
}
}
要记住的要点是 equals 方法的类型是 Object
,而不是你的 class type
.