以下是两个例子:
public class A {
public void foo(A a) {
System.out.println("in A");
}
}
public class B extends A {
public void foo(B b) { // (1)
System.out.println("in B");
}
public void f(Object o) { // (2)
System.out.println("in B");
}
}
我不明白为什么(1)和(2)被认为是A foo()
的覆盖方法。方法编号1接受比原始foo()
更低的类,我的意思是我不能向她发送任何A类,因为我看到它,(1)不延伸foo()
,但它是仍然算作覆盖 - 为什么?((2)的相似论点,但相反)。
我让我认为它被压倒的原因是:
当我试图运行时
B b = new B();
b.foo(b);
它会检查A
是否有foo
接受B
。因为每个B
都是A
,所以它确实有一个所以它应该打印“在A中”而不是“在B中”,因为B不会覆盖它。但它打印“在B”..
答案 0 :(得分:5)
他们都没有覆盖超类A'a方法。
class A {
public void foo(A a) {
System.out.println("in A");
}
}
class B extends A {
@Override
public void foo(B b) {
System.out.println("in B");
}
@Override
public void foo(Object o) {
System.out.println("in B");
}
}
当我编译上面的内容时,我得到错误:
$ javac -g O.java
O.java:10: method does not override or implement a method from a supertype
@Override
^
O.java:14: method does not override or implement a method from a supertype
@Override
^
2 errors
但请注意,从重写方法返回子类是可以的。以下编译没有错误。
class A {
public A foo() {
System.out.println("in A");
return this;
}
}
class B extends A {
@Override
public B foo() {
System.out.println("in B");
return this;
}
}
答案 1 :(得分:1)
要使覆盖生效,方法签名应该相同。在这种情况下,他们并不是因为他们所采取的论点不同。它们只是成员函数,1,2是重载。 (将2视为拼写错误。它应该是foo
而不是f
)
答案 2 :(得分:0)
1)或2)都不会覆盖任何内容,因为您可以通过添加@Override注释来验证:
public class B extends A {
@Override
public void foo(B b) {
System.out.println("in B");
}
@Override
public void f(Object o) {
System.out.println("in B");
}
}
这两种方法都不会编译,因为它不会覆盖任何内容。