覆盖还是超载?

The*_* do 2 java

伙计们,我知道这个问题很愚蠢但只是为了确保:
在我的班级方法中:

boolean equals(Document d)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)

我正在超载这种方法,也没有超越对吗?我知道这个或类似的问题将出现在即将发布的egzam上,如果没有得到这样一个简单错误的分数,那将是愚蠢的.

Boz*_*zho 9

根据提供的代码,我们无法确定您是否超载或覆盖它.

您很可能重载equals(Object o)方法.

class A {
   void method() {..}
}

class B extends A {
   // this is overriding
   void method() {..}
}
Run Code Online (Sandbox Code Playgroud)

// this is overloading
class A {
   void method(boolean b) {..}
   void method(String arg) {..}
   void method(int arg) {..}
}
Run Code Online (Sandbox Code Playgroud)

PS你正在使用一个在Java世界中没有被广泛接受的括号约定.在Java中,更常见的是将花括号放在同一个上.


Pét*_*rök 6

你甚至没有超载,因为调用了另一种方法equals.但是,如果你添加它s,你将会超载equals.虽然,确切地说,如果在同一个类中定义两个(或更多)具有相同名称但签名不同的方法,我们会谈论重载.在你的情况下,它更棘手,因为你equals的不同签名部分隐藏了原始equals.这通常是一件坏事,因为这几乎总会导致难以理解的行为,从而导致微妙的错误.每当有人调用equals您的类的实例时,根据参数类型,调用可能会转到该方法的不同实现.

class Document {
  public boolean equals(Document d)
  {
    //do something
  }
}

Document doc1 = new Document();
Document doc2 = new Document();
String string = new String();

doc1.equals(doc2); // calls Document.equals
doc1.equals(string); // calls Object.equals!
Run Code Online (Sandbox Code Playgroud)

Object.equals如果您使用与原始方法完全相同的签名定义您的方法,那么您将会重写,即

public boolean equals(Object obj) ...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,上述两个调用都能equals正确执行Document.equals.