当前位置: 首页 > 面试题库 >

在Java中重载等于时,为什么使用Object以外的参数不起作用?

栾鸣
2023-03-14
问题内容

我最近遇到了一个有趣的行为。似乎如果我重写.equals()以采用Object以外的参数,则不会调用它。谁能向我解释为什么会这样?这似乎违反了我对OOP中多态性的理解,但是也许我缺少了一些东西。

这是显示我所看到的内容的简单得多的代码:

public class MyClass {
  private int x;
  public MyClass(int n) { x = n; }
  public boolean equals(Object o) { return false; }
  public boolean equals(MyClass mc) { return x == mc.x; }
  public static void main(String[] args) {
    List<MyClass> list = new ArrayList<MyClass>();
    list.add(new MyClass(3));
    System.out.println("Contains 3? " + list.contains(new MyClass(3)));
  }
}

运行此命令时,将打印“ Contains 3? false”。看起来好像调用了equals(Object)函数,即使还有另一个可行的函数也是如此。相比之下,如果我这样写等于,则代码按预期工作:

public boolean equals(Object o) {
  if(!(o instanceof MyClass))
    return false;
  MyClass mc = (MyClass)o;
  return x == mc.x;
}

为什么不根据参数的类型来确定要调用的函数版本?


问题答案:

您正在混淆“覆盖”和“超载”。

覆盖-为多态性添加现有方法的替代定义。该方法必须具有相同的签名。签名由名称和参数类型组成。根据目标对象的运行时类型在运行时选择覆盖的方法。

重载-添加名称相同但签名不同的方法。根据目标对象的编译时类型在编译时选择重载方法。



 类似资料:
  • 问题内容: 我正在读一本关于数据结构的书。目前,我正在使用图形,下​​面的代码用于图形的顶点部分。 当我尝试实现此equals方法时,我的编译器抱怨没有检查参数的类型,而只是允许向其发送任何对象。对于我来说,为什么该参数不应该是“顶点”而不是“对象”,这似乎也让我有些奇怪。作者这样做是有原因的吗,还是这个错误或过时的例子? 问题答案:

  • 问题内容: 我想知道为什么它是Java不允许超负荷使用,虽然他们都以不同的方式使用? 使用方式如下: 而另一种形式: 使用方式如下: 这背后有什么原因吗? 问题答案: 这个15.12.2.5选择最具体的方法对此进行了讨论,但是它相当复杂。例如,在Foo(数字…整数)和Foo(整数…整数)之间进行选择 为了向后兼容,这些实际上是同一件事。 例如,您可以将main()定义为 一种使它们与众不同的方法是

  • 问题内容: 这是我的代码段: 但是由于某种原因,正在返回,从而抛出。 问题答案: if (!”success”.equals(statusCheck))

  • 问题内容: 我已经在许多网站上阅读了Optional应该仅用作返回类型,而不能在方法参数中使用。我正在努力寻找一个合理的理由。例如,我有一段逻辑,其中包含2个可选参数。因此,我认为这样写我的方法签名(解决方案1)会很有意义: 许多指定为的网页不应用作方法参数。考虑到这一点,我可以使用以下方法签名并添加清晰的注释以指定参数可以为null,希望将来的维护者将读取,因此始终在使用参数之前进行检查(解决方

  • 我想知道为什么执行这段代码时没有抛出(确切地说是ArithmethicException): 代码: null

  • 问题内容: 我在开发过程中注意到了这一点。 为什么三元运算符不能在方法参数中使用?这显然是或(其他)。 问题答案: 表达式的类型为,因为这是()和()的常见类型。 您没有任何接受的方法。因此,编译错误。