黑马程序员技术交流社区

标题: 静态变量和非静态变量的区别 [打印本页]

作者: 郑朝明    时间: 2013-1-23 14:42
标题: 静态变量和非静态变量的区别
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();
    }
}
作者: 陈丽莉    时间: 2013-1-23 15:05
本帖最后由 陈丽莉 于 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:34
静态成员随着类的加载而加载,等于是一旦生成类文件,静态成员就已经存在了,而非静态成员则是通过构造函数创建对象在堆内存中开辟空间才会出现,
当你第一次调用a对象方法是该静态变量是0,但是在你调用b对象方法之前,那个静态变量已经是1了,所以调用了以后该静态变量自身再次加1,所以就出现了你的那种结果。

作者: 靳石磊    时间: 2013-1-23 16:08
静态成员属于类,静态台成员只能访问静态成员(如静态方法只能访问静态方法和静态变量),非静态成员可以访问静态成员和非静态成员~
作者: 黑马刘俊    时间: 2013-1-23 19:03
静态变量只随着类的加载初始化一次,学姐这里有点问题吧,静态变量在类每次实例化的时候好像都会加载,如果要只加载一次,必须要将静态变量的初始化放在静态构造函数里面才行吧。

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2