覆盖还是超载?

时间:2010-03-31 11:45:34

标签: java

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

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

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

5 个答案:

答案 0 :(得分:9)

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

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

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

class B extends A {
   // this is overriding
   void method() {..}
}

// this is overloading
class A {
   void method(boolean b) {..}
   void method(String arg) {..}
   void method(int arg) {..}
}

P.S。您正在使用java世界中未被广泛接受的括号约定。在Java中,更常见的是将花括号放在同一个上。

答案 1 :(得分: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!

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

public boolean equals(Object obj) ...

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

答案 2 :(得分:1)

从你发布的代码中,它可以是。如果在具有相同参数声明的超类中定义equal,那么您将覆盖它。如果已有一个名为equal的方法,但具有不同的参数类型,则表示您正在重载它。

答案 3 :(得分:0)

在相关的说明中,如果您使用的是Java 5及更高版本,并且您的意图是覆盖,那么强烈建议在方法定义之前使用@Override注释来表明您的意图。此注释的错误用法(即,当您要覆盖并且不执行此操作时)将标记编译错误。

从Java 6开始,您可以在定义方法时使用@Override注释 在接口中声明实现的类。

答案 4 :(得分:-1)

重载:相同的方法名称,相同的参数列表,不同的类 覆盖:相同的方法名称,不同的参数列表,相同或不同的类。

Class A {

    bool Equals(Document d) {...} 

    bool Equals(A a) {...} // overloaded method
}

Class B extends A {
    bool Equals(Document d) {...} // overridden method

    bool Equals(B b) {...} // overloaded method
}

有一点需要注意,返回类型并不重要,它是方法的名称和参数列表,它们完全不同。