2016-03-15 36 views
1

我知道在java中擴展關鍵字do,但是我想了解java編譯器在看到extends keyword時做了什麼。是java擴展關鍵字的一個引用變量嗎?

class A{ 
//some state 

//some behavior 
} 

class B extends A{ 

} 
在編譯時看到我看來

extends關鍵字,然後它會在子類中使用超類對象。我知道我們可以在子類構造函數中使用超級引用關鍵字來引用超類構造函數。

回答

3

不,沒有對超類對象的引用。當你做new B(),你的例子中,有一個對象創建,它具有AB功能的組合,而不是單獨的BA對象與它們之間的關係。 (這將是原型繼承,它用於幾種語言,但不是Java)。

super不是對單獨對象的引用。從JLS§15.11.2

形式super.Identifier是指命名的當前對象的標識符領域,但視爲當前類的超類的一個實例的當前對象。

有時候,好像有必須是兩個不同的對象,當你的影子實例字段,如:

class A { 
    private int field; 

    A(int value) { 
     this.field = value; 
    } 

    public void sayField() { 
     System.out.println("(A) field == " + this.field); 
    } 
} 

class B extends A { 
    private int field; 

    B(int aValue, int bValue) { 
     super(aValue); 
     this.field = bValue; 
    } 

    @Override 
    public void sayField() { 
     super.sayField(); 
     System.out.println("(B) field == " + this.field); 
    } 
} 

如果你這樣做:

B b = new B(1, 2); 
b.sayField(); 

..你得到(live copy

 
(A) field == 1 
(B) field == 2 

如果只是一個對象,它怎麼能是this.fieldA#sayField使用不同的fieldthis.fieldB#sayField?答案是:在一個對象中有兩個field字段。編譯器通知A#sayField中的代碼使用第一個,並且B#sayField中的代碼使用第二個。

+0

是擴展關鍵字參考變量嗎? –

+0

我的主要conense是擴展關鍵字。它是如何工作的 ? –

+0

@RidaBatool:不,再次,沒有單獨的對象可供參考。我已經擴展了一些答案,試圖使這一點更清楚。 –