2014-02-08 44 views
1

我有這2類:繼承問題,我無法理解

public class A { 
    protected int _x; 

    public A() { 
     _x = 1; 
    } 

    public A(int x) { 
     _x = x; 
    } 

    public void f(int x) { 
     _x += x; 
    } 

    public String toString() { 
     return "" + _x; 
    } 
} 
public class B extends A { 
    public B() { 
     super(3); 
    } 

    public B(int x) { 
     super.f(x); 
     f(x); 
    } 

    public void f(int x) { 
     _x -= x; 
     super.f(x); 
    } 

    public static void main(String[] args) { 
     A[] arr = new A[3]; 
     arr[0] = new B(); 
     arr[1] = new A(); 
     arr[2] = new B(5); 
     for (int i = 0; i < arr.length; i++) { 
      arr[i].f(2); 
      System.out.print(arr[i] + " "); 
     } 
    } 
} 

輸出爲3 3 6,我不知道爲什麼第三次迭代是6

+1

使用調試器。 –

+1

你介意讓整個例子有點合理嗎?我不介意閱讀本身非常麻煩的代碼,但是閱讀半混淆的變量/類名稱會很快變得煩人。還要添加'@ Override'標籤。 – skiwi

+0

只需仔細閱讀您的想法中的代碼......當您不調用超級構造函數時,將調用空的超級構造函數。 – Matthias

回答

6

構造函數:

public B(int x) 
{ 
    super.f(x); 
    f(x); 
} 

被編譯器翻譯爲:

public B(int x) 
{ 
    super(); 
    super.f(x); 
    f(x); 
} 

我想現在你會明白,爲什麼它是6

+0

後第一個超級_x = 1,之後,我有super.f(x),所以它去f類函數內的A類,但因爲我有在B類的功能它實現f從B類和這個fi內有另一個time super.f(x)所以它看起來像遞歸 – user3271698

+0

@ user3271698'super.f(x)'不會調用重寫的方法。 –

+0

爲什麼不呢?它的B對象 – user3271698