class Program
{
static int i = getNum();
int j = getNum();
static int num = 1;
static int getNum()
{
return num;
}
static void Main(string[] args)
{
Console.WriteLine("i={0}", i);
Console.WriteLine("j={0}", new Program().j);
Console.Read();
}
}
//输出值为
i=0
j=1
分析上面的代码:
Console.WriteLine("i={0}", i);
这里 i 是 static 变量,在类 Program 第一次被加载时,要先为 Program 里面所有的 static 变量分配内存。尽管此刻有超线程技术,但是指令在逻辑上还是逐条的按挨次自上而下执行,所以 先为 static int i 分配内存,并且在该内存中连结int的缺省值0,接着再为 static int num 变量分配内存,值固然也为0。
然后第二步,为变量赋值:先为 static int i 变量赋值,,i=getNum(),看 getNum() 里面的代码,就是return num,这个时候 num 的值是 0 ,于是 i=0 。然后对变量num赋值,num=1;这行代码执行后,num就为1了。所以,j=1。
所以最后的功效为:
i=0 j=1
注意:
当类第一次被加载时,会对类中的静态变量先按挨次进行分配内存空间,当全部分配完内存空间之后,在对静态变量按挨次赋值。
首先分为两部分 寄存器和内存(包孕缓存)
内存分为两部分 代码和数据
数据分为两部分 静态存储区和运行时存储
运行时存储分为 仓库 和 堆
静态存储分为 全局静态存储 和 常量