為什么下面的程式產生的輸出是0,根據我的知識,輸出必須是100
。 class A{
int value=100。
public void printValue(){
System.out.println("Value from A : " value)。
}
A(){
printValue()。
}
}
class B extends A{
int value=200。
public void printValue(){
System.out.println("Value from B : "/span> value)。
}
}
class Demo{
public static void main(String args[]){
new B()。
}
輸出結果如下。 B的值:0
uj5u.com熱心網友回復:
首先你需要了解一些事情,比如類B繼承了類A,兩個類都有一個共同的方法printValue,這時,方法重寫的概念就出現了。"方法覆寫發生在類之間",所以我們簡單地 "覆寫 "了存在于 "類A "中的printValue,并在 "類B "中使用它。
"兩個方法的 "名稱"、"回傳型別 "和 "引數串列 "都是一樣的,因為方法覆寫的概念就是這樣。
其次,當你創建了 "B類 "的物件,它的默認建構式將被呼叫,但在此之前,"A類 "的建構式將被呼叫,因為它是 "B類 "的超類。
現在 "類A "中的建構式正在呼叫 "printValue",但它不會呼叫 "類A "中的方法,它將呼叫 "類B "的方法,而這一切步驟都發生在 "類B "的 "value "變數被初始化的200之前。
所以這就是為什么它要列印來自B的值:0
Value from A : 100
當 "類A "中的方法是靜態的時候,就會被列印出來,在這種情況下,我們將簡單地使用類的名稱來呼叫方法printValue,為此我們必須使printValue成為一個 "靜態 "方法。
在這之后,A : 100的值將被列印出來。
但是,由于你正在使 "printValue "方法成為靜態的,這是一個 "被覆寫的方法",也存在于 "類B "中,所以你必須使存在于 "類B "中的方法成為 "靜態","變數 "也將成為 "靜態"。
uj5u.com熱心網友回復:
當你呼叫new B();時,它將進入所有父類的建構式,即A()。然后建構式會呼叫B的printValue()方法,直到這里我們還沒有初始化value。由于int的默認值是zero。因此,同樣的東西將被列印出來。
uj5u.com熱心網友回復:
當你用new B()來實體化B類時,默認情況下它會呼叫其父級建構式A()
在建構式中再次呼叫方法printValue(),該方法已經被子類覆寫。
而這個方法已經被子類A覆寫了
因為在建構式中,它已經呼叫了printValue()。
因為在類B中呼叫printValue()的時候
值屬性還沒有被初始化,所以它的默認值是int 0。
將列印來自B的值:0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313398.html
標籤:
