2013-06-27 146 views

回答

9

您可以在子類中分配變量。你不能做的是把語句放在只允許聲明的地方。 (注意:int i = 10;是一個聲明 - 不聲明。)

在這種情況下,構造很可能會建立一個默認值合適的地方(亞型):

class b extends a { 
    public b() { 
    i = 1; 
    } 
} 

由於DAMO建議,一個初始化塊也可以工作。這在Initializing Fields tutorial討論:

通常情況下,你乾脆把代碼在構造函數中初始化實例變量,[但]有兩種選擇使用構造函數初始化實例變量:初始化塊和最終方法。

+0

...是一個聲明 - 不是一個聲明。我認爲這叫做聲明聲明。大聲笑 –

+0

@ su-我沒有在這裏使用精確的JLS支持的術語,很好的情況是這樣;問題的關鍵在於語言語法層面上的區別,根據具體情況允許(或禁止)不同的產品。 – user2246674

+0

這很好:)我明白了。 –

0

當你使用的是默認的訪問修飾符,這意味着在a類的屬性是同一個包中的所有類,包括子類b訪問。但是,您必須在方法中訪問該屬性。

0
class a { 
    int i; // this is an instance variable 
} 

實例變量是一類級別,它們可以被分配到文字或引用變量,或者你可以把它有它的默認值,子類可以使用公共實例裏面的方法或構造不在一流的水平,你做的事:

class b extends a { 
i = 3; // assgining a literal to i is compilation error 
} 

,因爲它是類字段和實例變量聲明,沒有什麼分配超類的實例變量的位置。

如果您想在類a中使用i,您必須在某個方法或構造函數中使用它。

class b extends a { 
a(){ 
    i = 4; 
} 

void doSomething(){ 
i = 5; 
} 
} 
1

所有的答案是正確的,但沒有一個人說,你可以做到這一點..

class b extends a { 
    { 
    i=1; 
    } 
} 

,這將編譯和執行是後a constructor之前b constructor

相關問題