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 = 4
并b = 14
。我明白了但是为什么下一个又一次呢?不应该是18岁吗?
答案 0 :(得分:4)
主要区别在于class A
member a
为static
,这意味着class A
的每个实例共享相同的值,而class B
使用实例变量b
,该变量重置为每个新实例的默认值(12)。
答案 1 :(得分:1)
调用B().g()
正在创建一个新的b
变量,将其值设置为12
,因为您要创建一个新的B
对象。
在h()
内,b++
将值设置为13和
return (a--) + (b++)
返回17,因为a
和b
值为4和13。
答案 2 :(得分:0)
首先让我们开始逐步阅读源代码。我们先来看看A班。
a
的静态整数变量,其值为12
g(), h()
和i()
g()
将a
减少一个并调用h()
现在a
的值为11。h()
将a
减少一个并调用i()
现在a
的值为10. i()
将a
减一,并返回a
现在返回的a
的值为9. 现在让我们剖析B类。
public (non static)
的{{1}}整数变量,其值为12。好的,你发现一个是静态而另一个不是。这意味着所有b
个对象从扣除的值继续,并且所有A
个对象在每个对象创建时使用重置的值。这就是你所犯的错误。