美文网首页
Static变量

Static变量

作者: 雨生_ | 来源:发表于2019-03-31 15:26 被阅读0次

Static 变量对于单例对象,几乎是固定的用法,很多人说Static变量是在程序执行的时候,直接加载的,我对这个问题抱有一个怀疑态度,我做了一个小测试,来试验一下这块内容。

代码如下:

static void Main(string[] args)
        {
            Console.WriteLine("Main start");
            Task.Run(() =>
            {
                var ins = StaticInstance.Instance;
                Console.WriteLine(ins.GetHashCode());
            });
            Task.Run(() =>
            {
                var ins = StaticInstance.Instance;
                Console.WriteLine(ins.GetHashCode());
            });
            Console.ReadLine();
        }

public class StaticInstance
    {
        public static StaticInstance Instance { get; } = new StaticInstance();
        
        static StaticInstance(){
            Console.WriteLine("Static Constructor Work");
        }
        private StaticInstance()
        {
            Console.WriteLine("Constructor Work");
        }

        public static void Hello()
        {
            Console.WriteLine("Hello, this is StaticInstance Class");
        }
    }

进入Main方法的时候,打印了进入的消息,然后调用了instance单例对象,结果打印的输出结果是

Main start
Constructor Work
Static Constructor Work
63835064
63835064

所以得到了第一部分结论,对于静态标记的属性和方法,加载的顺序是:

  1. 静态变量
  2. 静态构造器

而且是只有用到Static变量的时候,才会加载,也就是说,如果你的程序有大量没有用到的单例对象,那他们不会被加载到内存

这里在修改一下Main方法,如果我不调用单例属性,只调用一个类的static方法,会怎么样,修改的代码如下:

 static void Main(string[] args)
        {
            Console.WriteLine("Main start");
            Task.Run(() =>
            {
                StaticInstance.Hello();
            });
            Task.Run(() =>
            {
                StaticInstance.Hello();
            });
            Console.ReadLine();
        }

执行后的结果是:

Main start
Constructor Work
Static Constructor Work
Hello, this is StaticInstance Class
Hello, this is StaticInstance Class

发现单例对象依然是被创建出来了。

所以我个人认为:

  1. 静态成员和构造器,在类调用的过程才会加载,并不是在程序进入的时候加载的
  2. 对于类的调用,不论是实例化方法,还是静态方法,调用的这个时候,虚拟机才会去加载类的信息到栈区,才会产生这样的现象,所以也是一个惰性加载的过程。

以上是关于Static变量的一些小Tips,希望对你有所帮助,如果不对,也欢迎批评指正。

相关文章

  • java随笔

    static变量和static方法 static变量 1.static修饰的变量:静态变量,静态变量在内存中只有一...

  • c++ static

    static函数只能访问static变量static变量不参与继承 static变量在main初始化之前完成赋值

  • OC中static、const、extern关键字理解

    static关键字 static关键字用于修饰变量。 static修饰局部变量当使用static修饰局部变量时, ...

  • C --- 关键字 static

    static 修饰变量 static 修饰局部变量 static 修饰局部变量(在函数内定义的变量),它的生存周期...

  • Java学习笔记

    变量 分类 实例变量(non-static 修饰) 类变量(static 修饰) 本地变量 参数 命名规则 区分大...

  • JAVA——static修饰符解惑及使用

    1. static的作用 static可以修饰变量,被static修饰的变量叫做静态变量,程序运行时静态变量存放在...

  • static关键字

    static的作用0.static可以修饰变量,被static修饰的变量叫做静态变量,程序运行时静态变量存放在方法...

  • 静态变量、常量和方法

    static关键字,由static修饰的变量、常量和方法被称作静态变量、常量和方法。 被声明为static的变量、...

  • extern static const inline

    static static 可以用来修饰静态变量,在iOS中,如果使用static修饰全局变量,则全局变量只能在当...

  • java之面向对象2

    static: 1.static使用之静态变量: 语法:static 类型名 变量名; Java 中被 stati...

网友评论

      本文标题:Static变量

      本文链接:https://www.haomeiwen.com/subject/ckfubqtx.html