关于类中静态变量与非静态变量的问题

kendezhu 2010-03-02 09:40:07
大致代码如下:
public class abc
{
static int a;
int b;
public abc()
{
a = a + 1;
b = a;
}
public void bcd()
{
Console.WriteLine("{0},{1}",a,b);
Console.Read();
}
}
class Program
{
static void Main(string[] args)
{
@ abc c = new abc();
c.bcd();
@@ abc d = new abc();
c.bcd();
c.bcd();
d.bcd();
Console.Read();
}
}

结果是:
1,1
2,1
2,1
2,2
我知道一个类的所有实例是共享静态变量的,但对于以上结果还是感到不解
1. @语句后 a=1 b=1
2. @@语句后 由于是重新创建了另一个实例且a是静态变量 c.bcd()得到的结果应该是a=2 b=2啊 为何是b=1啊
3. c.bcd()与d.bcd()为什么不同啊 为什么d.bcd()输出的结果与我期望的相同呢
...全文
147 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lchy110 2010-03-03
  • 打赏
  • 举报
回复
引用 7 楼 cuike519 的回复:
@  abc c = new abc();  // 首次实例化abc,此时a被创建在静态变量区,并且通过构造函数使得此时a=1(a默认是0),实例变量b=1
            c.bcd();          // 输出的时候看到1,1
        @@  abc d = new abc(); // 第二次实例化abc,a还是上次那个a,但是b是一个新值,b被分配在这个新实例的内存中,通过构造函数a被累加了,这句之后a=2,b=2
            c.bcd();          // 此时a=2,c实例的b还是1,所以输出2,1
            c.bcd();          // 这个和上一句是相同的输出2,1
            d.bcd();          // 这里a=2,但是b是d的实例,所以b=2,这里输出是2,2

正解 第一个@那实例化后为1,1 但顺序执行到@@ 静态变量保存的第a还是1 实例第二次的时候就变成a=2 所以你的第二个c.bcd()输出为2,1 其实cuike519 说的很清楚了 呵呵
baishi1987 2010-03-03
  • 打赏
  • 举报
回复
LS正解,说的十分到位,静态变量实例化后就会保留值,而非静态变量则在实例化时,仍是初始值
cuike519 2010-03-03
  • 打赏
  • 举报
回复
@ abc c = new abc(); // 首次实例化abc,此时a被创建在静态变量区,并且通过构造函数使得此时a=1(a默认是0),实例变量b=1
c.bcd(); // 输出的时候看到1,1
@@ abc d = new abc(); // 第二次实例化abc,a还是上次那个a,但是b是一个新值,b被分配在这个新实例的内存中,通过构造函数a被累加了,这句之后a=2,b=2
c.bcd(); // 此时a=2,c实例的b还是1,所以输出2,1
c.bcd(); // 这个和上一句是相同的输出2,1
d.bcd(); // 这里a=2,但是b是d的实例,所以b=2,这里输出是2,2
itliyi 2010-03-03
  • 打赏
  • 举报
回复
引用 3 楼 cpp2017 的回复:
@@  abc d = new abc();  在这里再新建一个实例时,这里的b与原来那个b不是同一个变量,这个b是
对象d的b原来是c.b 完全不是一码事。
kendezhu 2010-03-03
  • 打赏
  • 举报
回复
哦,明白了。
有两点
1. 同一个类的所有实例都共同使用同样的静态变量,只要一个实例改变了该静态变量,那么其他实例在使 用该静态变量的时候是使用的改变后的值。
2.不同的实例在使用静态变量的时候都是共同的那个静态变量(和1总结的一样),而非静态变量是它自己的。
xray2005 2010-03-02
  • 打赏
  • 举报
回复
引用 3 楼 cpp2017 的回复:
@@  abc d = new abc();  在这里再新建一个实例时,这里的b与原来那个b不是同一个变量,这个b是
对象d的b原来是c.b 完全不是一码事。


顶(慕白兄)
mayonglong 2010-03-02
  • 打赏
  • 举报
回复
引用 2 楼 cpp2017 的回复:
@@语句后 由于是重新创建了另一个实例且a是静态变量  c.bcd()得到的结果应该是a=2 b=2啊
==>
b为什么是2呢?这里的b还是c的b即是第一个实例的那个b ,没变。


d.bcd是因为d 在实例他时,a已经=2了,d.b=a所以=2


呵呵,基础还是很重要哦~
cpp2017 2010-03-02
  • 打赏
  • 举报
回复
@@ abc d = new abc(); 在这里再新建一个实例时,这里的b与原来那个b不是同一个变量,这个b是
对象d的b原来是c.b 完全不是一码事。
cpp2017 2010-03-02
  • 打赏
  • 举报
回复
@@语句后 由于是重新创建了另一个实例且a是静态变量 c.bcd()得到的结果应该是a=2 b=2啊
==>
b为什么是2呢?这里的b还是c的b即是第一个实例的那个b ,没变。


d.bcd是因为d 在实例他时,a已经=2了,d.b=a所以=2


我姓区不姓区 2010-03-02
  • 打赏
  • 举报
回复
静态变量只实例化一次

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧