0

私はこれらの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そうではない理由を理解しようとしています1 最初にClass A 空のコンストラクターがそう呼ばれ、そう呼ばれる_x = 1 よりもそう呼び出され、呼び出し後==> 1f(int x) from class B_x = _x - 2_x = -1Super.f(x) _x = _x + x

4

2 に答える 2

1

配列の 2 番目の要素は、引数なしのコンストラクターで初期化されたarr型のオブジェクトですA

arr[1] = new A();
...
public A(){  
    _x = 1;  
}

f(2)そのオブジェクトを呼び出します。これがA#f(int)メソッドf()になります(つまり、Aクラスのメソッド)

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

したがって、2 を 1 に加算します。3.


あなたは最初の要素を意味していたようです。最初の要素は、引数なしのBコンストラクターで初期化されます

arr[0] = new B();
...
public B() {  
    super(3);  
}

Aコンストラクターを呼び出す

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

に設定_x3ます。f(2)このオブジェクトを呼び出すと、ポリモーフィズムと遅延バインディングのためにf(int)メソッドが呼び出されます。B

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

これにより、2から3が削除されます。1. しかし、はに 2 を足し戻すのバージョンをsuper.f(x)呼び出します。の最終結果は 3 です。Af(int)_x_x

于 2013-11-12T19:21:49.033 に答える
0

最初の要素は のインスタンスですB。を呼び出すデフォルトのコンストラクタが呼び出されますsuper(3);_xは 3 に等しくなります。ループの最初の反復では、 this が のメソッドarr[0].f(2);を呼び出します。これは 2 ずつ減少するため、3-2=1 です。次にスーパーオブが呼び出されます-> 1 + 2 = 3.fB_xf

于 2013-11-12T19:34:51.563 に答える