这是两个例子:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么(1)和(2)被认为是A的覆盖方法foo()
.方法编号1接受比原版更低的类foo()
,我的意思是我不能向她发送任何A类.正如我所看到的,(1)没有扩展foo()
,但它仍然算作覆盖 - 为什么?(类似(2)的论据,但相反).
我让我认为它被压倒的原因是:
当我想跑的时候
B b = new B();
b.foo(b);
Run Code Online (Sandbox Code Playgroud)
它检查是否A
有foo
接受B
.因为每一个B
都是一个A
,它确实有一个所以它应该打印"在A"而不是"在B",因为B不会覆盖它.但它打印"在B"..
它们都没有覆盖超类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");
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译上面的时候我得到错误:
$ 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
Run Code Online (Sandbox Code Playgroud)
但请注意,可以从重写方法返回子类.以下编译没有错误.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1790 次 |
最近记录: |