2011-10-04 80 views
4

爲什麼第二次調用會產生它所做的事情?我認爲通過鑄造thisSuper,只有Super's m1()應該被稱爲!投到超級未按預期工作

Super! 
And Sub! 
--- 
Super! 
And Sub! 

代碼:

public class TestSuper { 
    public static void main(String[] args) { 
     (new Sub()).m1(); 
     System.out.println("---"); 
     (new Sub()).m2();    // !!!!!!!!!!!!!!!! 
    } 
} 

class Super { 
    void m1() { 
     System.out.println("Super!"); 
    } 
} 

class Sub extends Super { 
    void m1() { 
     super.m1(); 
     System.out.println("And Sub!"); 
    } 

    void m2() { 
     ((Super) this).m1(); 
    } 
} 
+1

爲什麼要這樣呢?這與Super s = new Sub()相同。 s.m1(); –

回答

10

不,鑄造不會幫助,因爲它是動態類型的二手選擇m1調用的對象。

下面的伎倆:

void m2() { 
     super.m1(); 
    } 
0

這是一個很好的問題。據JLS §15.11.2

super.name被處理就好像它已經表達 ((S)this).name

但這僅適用於場一類的,不方法(如@ILMTitan注意)。

+1

JLS的那一段只是談論領域。 15.12談論方法。 – ILMTitan