A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑朝明 中级黑马   /  2013-1-23 14:42  /  2036 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

using System;
class Method
{
    class A
    {
        public static int i = 0;//定义静态变量i
        //问题就在这把上面的static去掉的话。最后I的值会变成1这是为什么呢
        public void add1()//定义ADD方法
        {
            i = i + 1;
        }
    }
    static void Main()
    {
        A a = new A();
        a.add1();//通过A实例调用ADD方法
        A b = new A();
        b.add1();//通过B实例调用ADD方法
        Console.WriteLine(A.i);//打印I的值=2
        Console.ReadKey();
    }
}

评分

参与人数 1技术分 +1 收起 理由
潘梦军 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 陈丽莉 于 2013-1-23 16:17 编辑

      静态变量只随着类的加载初始化一次,也就是说,这里 i 的生命周期是和class A相同的,下面的main函数调用一次, i 就自增1;a和b对象调用的 i 其实是同一个。
      而去掉static后,这个变量就随着对象走了,创建一个对象就会有一个相应的 i 生成,并且初始化为0;所以去掉之后,a调用,和b调用的就不是同一个 i 了。
      记得学校的老师讲访问次数的时候,就强调一定要将计数的变量用static修饰。

点评

学姐你讲的真好很仔细。你一讲我就明白了,谢谢  发表于 2013-1-23 15:31

评分

参与人数 1黑马币 +10 收起 理由
郑朝明 + 10 很给力!

查看全部评分

回复 使用道具 举报
静态成员随着类的加载而加载,等于是一旦生成类文件,静态成员就已经存在了,而非静态成员则是通过构造函数创建对象在堆内存中开辟空间才会出现,
当你第一次调用a对象方法是该静态变量是0,但是在你调用b对象方法之前,那个静态变量已经是1了,所以调用了以后该静态变量自身再次加1,所以就出现了你的那种结果。

评分

参与人数 1技术分 +1 收起 理由
潘梦军 + 1

查看全部评分

回复 使用道具 举报
静态成员属于类,静态台成员只能访问静态成员(如静态方法只能访问静态方法和静态变量),非静态成员可以访问静态成员和非静态成员~

评分

参与人数 1技术分 +1 收起 理由
潘梦军 + 1

查看全部评分

回复 使用道具 举报
静态变量只随着类的加载初始化一次,学姐这里有点问题吧,静态变量在类每次实例化的时候好像都会加载,如果要只加载一次,必须要将静态变量的初始化放在静态构造函数里面才行吧。

我模糊记得是这样的,如果不对请指出,谢谢

评分

参与人数 1技术分 +1 收起 理由
潘梦军 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马