gpt4 book ai didi

java - 重载或重写 equals() 方法

转载 作者:行者123 更新时间:2023-12-02 18:28:24 24 4
gpt4 key购买 nike

我对以下场景中首先调用什么感到有点困惑:

我有一个包含姓名和年龄的 Person 类。

public class Person {
private int age;
private String name;

//constructor, getters, ...
}

我现在尝试比较两个单独的 Person具有相同字段值的对象,即相同的名称、相同的年龄

System.out.println(person1.equals(person2));

我显然收到了 false返回值,因为我没有覆盖 equals(Obj object)方法还没有。

但如果我不覆盖它,我会写另一个 equals()仅使用 Person 的方法论据:

public equals(Person person) {
return person.get_age()==this.age && person.get_name().equals(this.name);
}

现在调用哪个方法,为什么?下面的行仍然返回 false

System.out.println(person1.equals(person2));

除非我强制person2被解释为 Person 。因此,下面的行返回 true

System.out.println(person1.equals((Person)person2));

这就是让我困惑的地方,我现在将该类型强制删除为 Person由于某种原因,当我一次又一次地构建和运行代码时,它不断返回 true 。强制它开始返回的唯一方法false再次,即继续采用默认值 equals(Object obj)再次的方法是删除 equals(Person person)方法,运行一次代码,然后粘贴回我刚刚删除的方法。现在比较不断返回 false再次。

JVM 是否缓存了某些中间状态?老实说,我对 java 有点陌生。

最佳答案

重写是指实现已在父类(super class)中声明的方法。要符合覆盖的资格,覆盖的签名必须与被覆盖的方法的签名匹配(在一定的容差范围内)。 ​

重载是指您有多个名称相同但签名不同的方法。

在存在重载的情况下,调用哪一个重载仅由调用站点参数的静态类型决定。。在您的示例中,您有两个 equals 重载:

boolean equals(Object o) { ... }
boolean equals(Person p) { ... }

当您调用时:

Person p = ...
... equals(p) ...

重载选择过程如下:

  • 确定参数的静态类型。
  • 确定哪些重载适用(使用数量、子类型、转换等)
  • 如果有多种适用,请确定最具体的一项。
  • 如果两个或多个同样具体,则会发出编译时错误。

这里,参数类型是 Person,并且两个重载都适用(因为 PersonObject),但是 equals(Person) 更具体,因此调用了一个。

如果我们稍微改变一下故事:

Object p = new Person(...);
... equals(p) ...

现在,p 的静态类型是 Object,因此只有第一个重载 - equals(Object) - 可用。我们所知道的是它是一个对象;它碰巧容纳了一个,这是我们静态无法得知的。 (我们可以使用 instanceof 动态找到它。)

总结一下:

  • 表达式具有静态(编译时)和动态(运行时)类型;
  • 重载选择纯粹基于静态类型。

现在,您可能不想为您在这里看到的相同问题声明 equals(Person) - 它看起来像是一个覆盖,但实际上它是一个重载,并且不会'当您认为会被调用时,就不会被调用。

关于java - 重载或重写 equals() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69781978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com