2016-12-06 73 views
0

這是我的考試給我一個編碼的問題,我似乎無法弄清楚發生了什麼,將是有益的,如果有人能告訴我發生了什麼:)調用重載方法鑄造類與「本」關鍵字

class A1 { 
    void m1() { 
     System.out.println("A"); 
    } 
} 

class B1 extends A1 { 
    void m1() { 
     System.out.println("B"); 
    } 
} 

class C1 extends B1 { 
    void m1() { 
     System.out.println("C"); 
    } 
} 

public class D1 extends C1 { 

    void m1() { 
     System.out.println("D"); 
    } 

    void m2() { 
     m1(); 
     ((C1) this).m1(); 
     ((B1) this).m1(); 
     ((A1) this).m1(); 
    } 

    public static void main(String args[]) { 
     new D1().m2(); 
    } 

} 

這將產生輸出:

D 
D 
D 
D 

我的預期輸出:

D 
C 
B 
A 

我想知道爲什麼即使在使用「this」關鍵字的情況下,它仍然在調用同一個類中的方法。

+1

的可能的複製[Java繼承(http://stackoverflow.com/questions/3506412/java-inheritance) – Winter

+0

因爲雖然你施放該類型您的實例仍然是最派生之一。因此,當你調用'm1'時,也會使用派生最多的方法,這是在'D'中定義的。 – HimBromBeere

回答

2

即使您告訴編譯器將其視爲超級實例,所有實例仍然是相同的實例。

void m2() { 
     m1(); 
     ((C1) this).m1(); 
     ((B1) this).m1(); 
     ((A1) this).m1(); 
    } 

如果你有大衆Polo和他們都投來的車,它仍然是一個波羅還是會調用它自己的方法。