所以我一直在研究继承,而我偶然发现了这个程序:
public class HelloWorld {
static class A {
void f() { System.out.println("A"); }
}
static class B extends A {
void f() { System.out.println("B"); }
}
static class C {
void func(B b) { b.f(); }
}
static class D extends C {
void func(A a){ a.f(); }
}
public static void main(String args[]) {
( (new D())).func( (A) (new B()));
A a = new B();
a.f();
B b = new B();
C c = new D();
c.func(b);
}
}
因此,即使A和C在最后几行中以完全相同的方式实现,A的方法被B覆盖,但C不被D覆盖?该程序打印如下:乙乙B
这是因为func
中的方法D
没有覆盖C
的签名更改。
static class C {
void func(B b) { b.f(); }
}
static class D extends C {
void func(B a){ a.f(); }
}
这将导致方法的覆盖