伙计们我知道这个问题很愚蠢但只是为了确保:
在我的班级方法:
boolean equals(Document d)
{
//do something
}
我正在超载这种方法,也没有超越对吗?我知道这个或类似的问题将出现在即将发布的egzam上,如果没有为这样一个简单的错误得分,那将是愚蠢的;
答案 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
}
有一点需要注意,返回类型并不重要,它是方法的名称和参数列表,它们完全不同。