2013-04-21 25 views
0

我嘗試使用thissuper以下代碼段。在Java中使用this和super

class SuperClass 
{ 
    public final int x=10; 
    public final String s="super"; 

    public String notOverridden() 
    { 
     return "Inside super"; 
    } 

    public String overrriden() 
    { 
     return "Inside super"; 
    } 
} 

final class SubClass extends SuperClass 
{ 
    private final int y=15; 
    private final String s="sub"; //Shadowed member. 

    @Override 
    public String overrriden() 
    { 
     return "Inside sub"; 
    } 

    public void test() 
    {   
     System.out.println(super.notOverridden()); 
     System.out.println(this.notOverridden()); 

     System.out.println(this.overrriden()); 
     System.out.println(super.overrriden()); 

     System.out.println(this.s); 
     System.out.println(super.s); 

     System.out.println(this.x); 
     System.out.println(super.x); 

     System.out.println(this.y); 
    } 
} 

public final class Test 
{ 
    public static void main(String[] args) 
    { 
     SubClass subClass=new SubClass(); 
     subClass.test(); 
    } 
} 

在這種最簡單的Java代碼,該重定向類​​顯示輸出以下內的方法test()內的輸出到控制檯的語句。

Inside super 
Inside super 
Inside sub 
Inside super 
sub 
super 
10 
10 
15 

因此,看來有thissuper之間沒有差別,當它們被用於未在它的子類(ES)重寫訪問方法和在變量情況下,當它們沒有在陰影其子類(es)。

他們都傾向於指向超類成員。然而,如果不是這種情況,則會有明顯的區別。

它們是否相同,當方法沒有被覆蓋或者變量沒有被映射到相應的子類中?

+1

這聽起來像你已經回答了你的問題,但是有。 – supersam654 2013-04-21 01:17:34

+1

是的,但我認爲這是危險的假設。你最終可能會覆蓋子類中的方法,然後超級,這不會給出相同的結果。 – Matt 2013-04-21 01:20:12

+0

「在其子類中未被覆蓋的方法」一個類不應該知道其子類的任何內容。你不能確定該行的一些子類不會覆蓋該方法,除非它是「final」。 – newacct 2013-04-21 20:18:51

回答

2

因此,它似乎有當它們用於未在 它的子類(ES)和變量的情況下,覆蓋的接入方式thissuper, 之間沒有區別,當他們不 在其子類中有影子。

有差別。如果您覆蓋第三類中的方法,並從中調用test,您將會看到,super仍然調用SuperClass的實現。並且this將調用新的實現(重寫)。

增加:

使用意味着方法屬於該對象的實例。所以最後的實現將被使用(除了私有方法)。

super.method()用法暗示實例的方法,但在當前類(super或super.super等)之前實現。

+0

另外,你不能在同一個構造函數中調用this()和super()。 – 2013-04-21 01:27:56

+0

'super'是相對的,所以它會調用'SubClass'中的重寫方法。 'this'也會,除非它們在SubSubClass中被覆蓋。 – ddmps 2013-04-21 01:28:05

1

是的,它們是相同的。 notOverridden方法而不是被子類繼承的影子變量。

爲了更好地理解這一點,瞭解對象在內存中的位置很有幫助。例如在下圖中。假設它是一個子類的對象。藍色區域是它從父項繼承的區域,黃色區域是它自己定義的內容。除了使用Vtable之外,該方法具有類似的設計。

子對象具有與父對象相同的內存佈局,除了它需要更多空間來放置新添加的字段。這種佈局的好處是,指向子類對象的父類型指針在開始處仍然會看到父對象。

enter image description here

相關問題