[英]How does inheritance work in this bit of code?
伙計們,我一直在玩 inheritance,我偶然發現了這個程序:
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 覆蓋? 程序打印如下: BBB
因為 Class D function 定義比 C 更通用。C 的 function 采用 B 類型參數,但 D function 采用類型 A 參數,它是 B 的父級。它比 88340040658981837 中定義的 88340040658981837 更通用
static class D extends C {
void func(A a){
a.f();
}
}
B b = new B();
C c = new D();
c.func(b);
變量 c 指向 D 的 object,因此 c.func(b) 調用 D 中定義的方法。A 是 B 的父級,因此調用 B 的方法。 與使用 A 的引用調用相同,如下所示。
A a = new B();
a.f();
這是因為D
中的方法func
沒有覆蓋與簽名更改相同的C
。
static class C {
void func(B b) { b.f(); }
}
static class D extends C {
void func(B a){ a.f(); }
}
這將導致重寫該方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.