4
public class A {
    public static int a = 12;
    public virtual int g() { a--; return h(); }
    public virtual int h() { a--; return i(); }
    public int i() { return --a; }
}
class B : A {
    public int b = 12;
    public override int h() { b++;  return (a--) + (b++); }
    public new int i() { return this.g(); }
    static void Main(string[] args) {
        Console.WriteLine("A: {0} {1} {2}", new A().g(), new A().h(), new A().i());
        Console.WriteLine("B: {0} {1} {2}", new B().g(), new B().h(), new B().i());
        Console.ReadLine();
    }
}

私は自分自身の例を見つけて、立ち往生しています。私はそれが印刷されることを知っています:

A: 9 7 6

しかし、なぜそれが印刷されるのかわかりません:

B: 18 17 15

Aレーンで12 を取り、g()11 にし、それを押して、h()10 にi()し、他の場所に行く前に 9 にします。だからA、確かに : 9 です。それからまた同じことなので、9 7 と 6 です。ただし、B: では、既存の a (現在は 6) を取り、g()5 にします。その後、bは 13 にインクリメントされ、5+13=18 になります。その後、a = 5に変わります。私は理解しています。しかし、なぜ次の 17 で再び 17 になるのでしょうか。18歳じゃないの?a = 4b = 14

4

3 に答える 3

4

主な違いは is の場合です。class Aこれmember astatic、のすべてのインスタンスがclass A同じ値を共有するのに対し、新しいインスタンスごとにデフォルト値 ( 12 ) にリセットされるclass Bインスタンス変数を使用することを意味します。b

于 2013-06-26T15:34:21.090 に答える
1

を呼び出すとB().g()、新しいb変数が作成され、その値が に設定されます。12これは、新しいBオブジェクトを作成しているためです。

内部h()b++は、値を 13 に設定し、との値が 4 と 13
return (a--) + (b++)であるため、17 を返しています。ab

于 2013-06-26T15:32:53.580 に答える
0

まず、ソースを段階的に読み始めましょう。まずクラスAを見てみましょう。

  • a値を保持するという静的整数変数があります12
  • 3つの機能がg(), h()あり、i()
  • 関数は 1 をg()減らしaて呼び出しh()ます Now の値aは 11 です。
  • この関数は 1 をh()減らしaて呼び出しi()ます Now の値aは 10 です。
  • この関数は 1 をi()減らしaて Now を返しますa。その値aは 9 です。

それでは、クラス B を分析してみましょう。

  • クラス A から拡張されます。
  • 値12を保持するというpublic (non static)整数変数があります。b

1 つが静的で、もう 1 つが静的ではないという違いがわかりました。これは、すべてのAオブジェクトが差し引かれた値から継続し、すべてのオブジェクトがBオブジェクトの作成ごとに 1 回リセットされた値を使用することを意味します。それはあなたが持っていたエラーです。

于 2013-06-26T15:50:40.520 に答える