日期:2014-05-18  浏览次数:20871 次

static的问题。
下面是代码,希望大家认真看一下,懂的人一看就懂的,我这程序是自学说构造函数的,我不懂的地方就是红色的这二个,有带static的哪个变量sctr的值通过运行最后变成3的,我也知道是static起作用,书上说是应为对象之间共享造成的,我就这个地方不懂,ctr这个变量运行后,反而值为什么才1,为什么ctr不变成3,我想的好久就是不明白,希望朋友们帮忙解释一下,谢谢!
public class myClass
{
  static public int sctr = 0;
public int ctr = 0;
  public void routine()
  {
  Console.WriteLine("In the routine... ctr={0}/sctr={1}",ctr,sctr);
  }

  public myClass()
  {
  ctr++;
  sctr++;
  Console.WriteLine("In constructor... ctr={0}/sctr={1}\n",ctr,sctr);
  }
}

class TestApp
{
  public static void Main()
  {
  Console.WriteLine("Start of Main method...");

  Console.WriteLine("Creating first object...");
  myClass first = new myClass();
  Console.WriteLine("Creating second object...");
  myClass second = new myClass();

  Console.WriteLine("Calling first routine...");
  first.routine();

  Console.WriteLine("Creating third object...");
  myClass third = new myClass();
  Console.WriteLine("Calling third routine...");
  third.routine();

  Console.WriteLine("Calling second routine...");
  second.routine();

  Console.WriteLine("End of Main method");
  Console.Read();
  }
}

------解决方案--------------------
转载自百度:

静态局部变量属于静态存储方式,它具有以下特点:
  (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
  (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
  (3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。
  (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜
2.静态全局变量
  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

学习学习

------解决方案--------------------
static是静态变量,被class的全部对象共享
非static的是实例变量,是各自对象特有的
------解决方案--------------------
仔细按下F11 逐步跟下 就明白了
------解决方案--------------------
public int ctr = 0; 
这变量你每声明一此类,就会重新声明.构造函数里面加了1,所有每次使用都是1.
static public int sctr = 0; 
这个变量是全局静态变量,只有你的程序不退出.第二次声明MyClass类时将不在重新声明.
在构造函数里面也加了1
所以当New 一个MyClass后会每次加1
myClass second = new myClass(); 
你在声明一次数据,将会 sctr =4,ctr =1

------解决方案--------------------
一步一步执行,自然就知道为什么是3了。

要注意学习方法。
------解决方案--------------------
注意 static 在 MSDN 中的第一句话 : 
Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object.

同时 ,提醒你注意 c# 是面向对象的,一切都是对象,即: object

static 修饰成员后,代表sctr 只是属于 myClass 类型的,即: 
C# code
myClass.sctr = 0;

------解决方案--------------------