zoukankan      html  css  js  c++  java
  • 类中的 static 字段

    using System;

    namespace teststatic
    {
        class class1
        {
            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 class1().j);
                Console.Read();
            }
        }
    }

    上面的代码是一个网友告诉我的,让我看看结果,我看了一眼马上说结果是  
      i=1  
      j=1  


      网友运行后说结果是  
      i=0  
      j=1   


    下面我解释一下为什么是后一种结果 :
    对一个类来说,static变量是与对象无关的,那么它们什么时候被初始化呢? 就是在第一次引用的时候。

    当类实例化的时候,可以简单分成3步如下

       

    1,为所有static变量分配内存,这个时候内存里面的值是该变量类型的缺省值。   
    2,为static变量赋值。   
    3,生成对象,调用构造函数,先调用这个类的父类的构造函数,然后调用类本身的构造函数,生成对象。


    现在分析上面的代码:   
    Console.WriteLine(string.Format("i={0}",i)); 这里 i 是static变量,而且类 class1 是第一次被引用,按照上面说的三步,要先为class1里面所有的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了。

    类的初始化步骤 :

    1. 初始化静态变量(如果有)
    2. 类的静态构造函数(如果有)
    3. 初始化实例变量
    4. 初始化实例构造函数

    注意,只是对值类型赋默认初值。

  • 相关阅读:
    ME05 黑匣子思维
    F06 《生活中的投资学》摘要(完)
    ME03 关于运气要知道的几个真相
    ME02 做一个合格的父母To be good enough parent
    ME02 认知之2017罗胖跨年演讲
    F03 金融学第三定律 风险共担
    F05 敏锐的生活,让跟多公司给你免单
    ML04 Accord 调用实现机器算法的套路
    D02 TED Elon Mulsk The future we're building — and boring
    ML03 利用Accord 进行机器学习的第一个小例子
  • 原文地址:https://www.cnblogs.com/abccome/p/3344604.html
Copyright © 2011-2022 走看看