静态成员(包括静态方法),是属于class的,而不是属于这个class的某个实例。
比如说整数类,我可能需要输出整数类的某个实例的值的大小,还有可能要获取整数类能代表的最大值。其中“整数类的最大值”就不是属于某个特定的整数类的实例,而是属于整数类的,这样获取“整数类的最大值”的方法就必须是静态的。比如:
class Integer {
int value;
public static int Maximun() {...} // 获取整数类的最大值
public void Print() {...} // 打印该整数值的大小
}
正是因为Maximun不是属于具体的某个整数类的实例,所以你才不能这样写:
Integer i = new Integer();
System.Console.WriteLine(i.Maximun());
而只能用Integer.Maximun()。
也正因为静态方法是属于整个类的,所以在静态方法中,你也只能使用静态的字段(它们也是属于整个类的),而不能使用依赖与某个特定的实例的字段(也就是非静态的字段),因为静态方法不依赖于某个具体的实例。
再举个例子:
比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的:)
方法占不占用更多内存,和它是不是static没什么关系。
因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所以字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。
但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是static还是non-static的方法,都只存在一份代码,也就是只占用一份内存空间。
同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class的成员变量的值……
静态的方法,只能访问静态的成员。不能访问实例成员。
比如说,一个类User
里面有一个字段userName
如果你用静态的字段(static string)
那么如果想同时拥有两个UserNaem不同的User的实例,怎么办呢?
所以说
不一定要全部声明为静态的,或者实例的
要根据实际情况来进行分析
一段教材式的代码:
using System;
using System.Collections;
public class MyClass
{
int x;
static int y;
void F()
{
x=1;
y=1;
}
static void G()
{
x=1; ///?????????????????????????为什么这里不能付值?
y=1;
}
public static void Main()
{
MyClass t= new MyClass();
t.x=1;
//t.y=1;
//MyClass.x=1;
MyClass.y=1;
}
}