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车道上,它g()需要 12 并变成 11,然后将其推到h()- 然后是 10,i()甚至在它去其他任何地方之前就变成了 9。所以肯定是A:9。然后它又是同样的东西,所以它是 9 7 和 6。但是在B: 它采用现有的 a(现在是 6)并将g()其设为 5。然后b递增到 13,然后 5+13=18。它变为a = 5之后a = 4b = 14。我明白了。但是为什么下一部又是17呢?不应该是18岁吗?

4

3 回答 3

4

主要区别在于 is 的情况class Amember astatic意味着每个实例class A共享相同的值,而class B使用一个实例变量b,该变量为每个新实例重置为默认值 (12)。

于 2013-06-26T15:34:21.090 回答
1

调用 toB().g()正在创建一个新b变量,将其值设置为12,因为您正在创建一个新的B对象。

内部h(),b++将值设置为 13,并
return (a--) + (b++)返回 17,因为ab值为 4 和 13。

于 2013-06-26T15:32:53.580 回答
0

首先让我们开始一步一步地阅读源码。我们先来看A类。

  • 它有一个名为a保存值的静态整数变量12
  • 共有三个功能g(), h()i()
  • 函数g()减一并a调用h()Now 的值为a11。
  • 函数h()减一并a调用i()Now 的值为a10。
  • 函数i()减一并a返回aNowa返回的值为 9。

现在让我们剖析 B 类。

  • 它从 A 类扩展而来。
  • 它有一个public (non static)整数变量,称为b保存值 12。

好的,您发现了一个区别,一个是静态的,另一个不是。这意味着所有A对象都从扣除的值继续,并且所有B对象在每次创建对象时都使用一次重置的值。这就是你遇到的错误。

于 2013-06-26T15:50:40.520 回答