2017-10-10 132 views
-2

關於繼承和方法覆蓋,我有以下練習,問題是爲什麼調用父類中'initialize()'方法中的'System.out.println(f1)'與參數'0',並且需要做什麼將被稱爲參數'6'。請幫我理解它。提前致謝。Java繼承和方法重寫程序

public class Solution { 
public static void main(String[] args) { 
    new B(6); 
} 

public static class A { 
    private int f1 = 7; 

    public A(int f1) { 
     this.f1 = f1; 
     initialize(); 
    } 

    protected void initialize() { 
     System.out.println(f1); 
    } 
} 

public static class B extends A { 
    protected int f1 = 3; 

    public B(int f1) { 
     super(f1); 
     this.f1 += f1; 
     initialize(); 
    } 

    protected void initialize() { 
     System.out.println(f1); 
    } 
} 

}

+2

' initialize'沒有*任何參數...並且你不會在'B'中重寫它,因爲它是一個私有方法。目前還不清楚你的期望以及爲什麼,說實話 - 但是你有兩個同名的領域只會增加混亂。 –

回答

0

Privare方法不能被覆寫。您可以在子代中編寫該方法,但實際上它不是壓倒性的

從Java語言規範JLS

請注意,在這些術語的技術意義上,私有方法不能被隱藏或覆蓋。這意味着子類可以在其一個超類中聲明一個與私有方法具有相同簽名的方法,並且不要求此類方法的返回類型或拋出子句與私有方法的返回類型或拋出子句具有任何關係超類。

你的父類的方法是沒有得到調用參數值0。如果你能看到父類的構造是壓倒一切的價值this.f1=f1f1值將是6。因此輸出將是6和9

+0

感謝JLS鏈接,它不僅幫助我做了很多練習! –