[英]is java extends keyword a reference variable?
我知道在java中擴展關鍵字do是什么,但我想了解java編譯器在看到extends關鍵字時會做什么。
class A{
//some state
//some behavior
}
class B extends A{
}
在我看來,當編譯器看到擴展關鍵字時,它會創建要在子類中使用的超類對象。 我知道我們可以在子類構造函數中使用超級引用關鍵字來引用超類構造函數。
不,沒有超類對象的引用。 當您使用您的示例執行new B()
,會創建一個對象,該對象具有A
和B
要素的組合,而不是單獨的B
和A
對象以及它們之間的關系。 (這將是原型繼承,它用於多種語言,但不是Java。)
super
不是對單獨對象的引用。 來自JLS§15.11.2 :
表單
super
.Identifier引用當前對象的名稱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();
......你得到( 現場副本 )
(A) field == 1 (B) field == 2
如果只是一個對象,它怎么能是this.field
內A#sayField
使用一個不同的field
比this.field
內B#sayField
? 答案是:該對象中有兩個field
。 編譯器告訴A#sayField
的代碼使用第一個,而B#sayField
的代碼使用第二個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.