关于静态数据成员和静态方法的疑问:
1.静态数据成员。
静态数据成员,从我的书上看,意思就是某个类中声明static的数据成员之后,所有实例都共享同一个“值”。在使用该成员时,因为该成员不属于任何对象,只属于类,所以应该使用:类型.成员名 来访问。那么我想问:
a.实际上,静态数据成员就是说,不用实例化,我也可以访问呢?但是不对啊,没有实例化的话,类本身已经分配了内存了吗?
b.静态数据成员是不是说所有的实例都共享同一个该成员的内存空间呢?2.静态方法:
这个是重点,是我最搞不懂的,可能是我的书太破了。
a.书上给了个例子:
//Myapp
using System;
class Myapp
{
  static long multy(long nbr1,long nbr2)
  {
   return nbr1 * nbr2;
  }
  public static void Main()
 {
  long x;
  long y;
  long result;
  result = multy(x,y);
  Console.WriteLine("The result of x multy y is :{0}",result);
 }
}
书上说,之所以使用static方法,是因为multy和Main方法位于同一个类(应用程序类Myapp)中,这样声明使得Multy方法在任何地方都可以调用,当然在Main()方法中也可以调用。
太简单了,这个说明。然后我自己去查了下静态方法的资料。得到如下资料:
“函数成员:
方法可以主要分为静态方法,实例方法静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量,静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变量做为参数传给静态方法。静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。实例方法:一个实例方法的执行与特定对象关联,他的执行需要一个对象存在。实例方法可以直接访问静态变量和实例变量,实例方法可以直接访问实例方法、和静态方法,静态方法的访问方式为类名加点操作符加变量名。当多个实例对象存在时,内存中并不是存在美个特定的实例方法的拷贝,而是,相同类的所有对象都共享每个实例方法的一个拷贝(实例方法只占用“一套”空间)。 ”
静态方法是不属于特定对象的方法,这我能理解。
静态方法可以访问静态成员变量,不可以直接访问实例变量。
这句有问题了,如上面的例子,在应用程序类运行后,不是生成了实例了吗,里面的X,Y不是实例变量吗?何为直接访问?
是不是形如:
class Myapp
{
 int x,y; static long multy()
 {
  //int x,y;  
  return x * y;
 }
 public static void Main()
 {
  //Method body...
 }
}
这种叫直接访问?
那么我想问,如果去掉例子2的局部变量声明,multy在使用自己的局部变量的时候有问题吗?
b."可以在实例函数调用的情况下,实例变量做为参数传给静态方法。"什么叫实例函数调用?不明白。
c.“静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。”这句更糊涂了。

解决方案 »

  1.   

    1.静态数据成员。
    静态数据成员,从我的书上看,意思就是某个类中声明static的数据成员之后,所有实例都共享同一个“值”。在使用该成员时,因为该成员不属于任何对象,只属于类,所以应该使用:类型.成员名   来访问。那么我想问:
    a.实际上,静态数据成员就是说,不用实例化,我也可以访问呢?但是不对啊,没有实例化的话,类本身已经分配了内存了吗?
    b.静态数据成员是不是说所有的实例都共享同一个该成员的内存空间呢?
    答:
    a.是的
    b.见《C#语言规范》10.2.5节----一个静态字段只标识一个存储位置。对一个类无论创建了多少个实例,它的静态字段永远都只有一个副本。========================================我是无敌的分割线========================================
    2.静态方法可以访问静态成员变量,不可以直接访问实例变量。
    这句有问题了,如上面的例子,在应用程序类运行后,不是生成了实例了吗,里面的X,Y不是实例变量吗?何为直接访问?答:
      这里的x,y不是实例变量(字段),是局部变量;局部变量是方法的一部分,所以可以直接访问。
    b."可以在实例函数调用的情况下,实例变量做为参数传给静态方法。"什么叫实例函数调用?不明白。
    c.“静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。”这句更糊涂了。答:
    b.见下示例namespace Test
    {
      public class TT
      {
        private int num = 10;
        
        public void Method1()
        {
          TT.Method2(num);
        }    public static void Method2(int param)
        {
          param = param * param;
          Console.WriteLine(param);
        }    public static void Main()
        {
          TT.Method2(10);
          TT test = new TT();
          test.Method1();
        }
      }
    }
    c.这句应该是写错了吧,"静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用实例方法。"
      同上,把"类的实例"也作为参数传进来。