簡體   English   中英

inheritance 在這段代碼中是如何工作的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM