素材: http://www.cnblogs.com/michaelxu/archive/2007/03/29/693401.html
简介
静态类只能有静态成员。
静态类不能被继承,这点是与多态相反的。
静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。
静态构造函数
静态构造函数只被执行一次,在该类第一次使用时执行。
静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符 就没有意义了。
静态构造函数不能被继承(不是静态类,也可以有静态构造函数)
用途
静态类不能被实例化,直接使用类名调用方法,静态类通常被封装成实用工具类。例如(console类)
在实例类中,静态成员变量用于对象的数据共享
对静态的理解:
输出结果是什么?
public
class
A
{
public
static
readonly
int
x;
static
A()
{
x = B.y + 1;
}
}
class
B
{
public
static
int
y = A.x + 1;
static
void
Main(
string
[] args)
{
Console.WriteLine(
"x:{0},y:{1}。"
, A.x, y);
Console.ReadLine();
}
}
简单值类型的全局变量默认初始值都是0.因为入口函数在类B,所以程序首先加载B,由于y是B的静态成员,类一加载时便会计算y的值,但是发现y的值是通过赋值的方式获得的,等号右边用到了A的x,此时会立即计算x的值,x是通过类A的静态构造函数初始化的,期间又引用了B的Y,此时y的值还是0(因为y的赋值语句还没执行完,故其值还是默认的),得到x=0+1=1,继续为y赋值得到y=x+1=2.
思考 :
程序的入口点 static void Main(string[] args){} 为静态函数,而静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等,这是什么原因???
”静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等“ 应该理解为可以在静态函数中创建非静态的局部变量,但不能引用与静态函数同级别的非静态成员
为什么静态成员无法访问类中非静态的成员?
程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类 的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一 个内存中不存在的东西当然会出错.
非静态成员,在创建类的实例时分配内存,类的不同实例对应不同的内存区域