这个时候 num 的值是 0

时间:2022-05-19 07:17:04

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

  注意:

  当类第一次被加载时,会对类中的静态变量先按挨次进行分配内存空间,当全部分配完内存空间之后,在对静态变量按挨次赋值。

  首先分为两部分 寄存器和内存(包孕缓存)

  内存分为两部分 代码和数据

  数据分为两部分 静态存储区和运行时存储

  运行时存储分为 仓库 和 堆
  静态存储分为 全局静态存储 和 常量