java静态构造函数,静态构造函数

1.
静态构造函数用于开始化静态数据,或用来实施仅需推行二次的卓越操作。

静态构造函数,java静态构造函数

  1. 静态构造函数用于开首化静态数据,或用于试行仅需试行贰回的特有操作。

  2. 静态构造函数既未有访问修饰符,也未曾子数。

三.
在成立第三个实例或引用任邹国平态成员此前,将自行调用静态构造函数来初步化类。

  1. 没辙直接调用静态构造函数。

五.
举个例子静态构造函数引发那3个,运维时将不会重复调用该构造函数,并且在程序运转所在的行使程序域的生存期内,类型将保险未起首化。

    class Program
    {
        static void Main(string[] args)
        {
            // 在bus1实例化后调用静态构造函数,只调用一次
            Bus bus1 = new Bus(71);
            Bus bus2 = new Bus(72);
            bus1.Drive();
            System.Threading.Thread.Sleep(3600);
            bus2.Drive();
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    public class Bus
    {
        protected static readonly DateTime globalStartTime;
        protected int RouteNumber { get; set; }
        static Bus ()
        {
            globalStartTime = DateTime.Now;
            Console.WriteLine("static constructor sets global start time to {0}", globalStartTime.ToLongTimeString());
        }
        public Bus (int routeNum)
        {
            RouteNumber = routeNum;
            Console.WriteLine("Bus #{0} is created", RouteNumber);
        }
        public void Drive()
        {
            TimeSpan elapsedTime = DateTime.Now - globalStartTime;
            Console.WriteLine("{0} is starting its route {1:N2} minutes after global start time {2}", this.RouteNumber, elapsedTime.TotalMilliseconds, globalStartTime.ToLongTimeString());
        }
    }

  

一.
静态构造函数用于开始化静态数据,或用来推行仅需进行三遍的万分规操作。 2.
静态构造函数既未有访问…

  先看1道常见标题,以下代码的实行结果是怎么样?

美高梅开户网址 1

2.
静态构造函数既未有访问修饰符,也从未参数。

    class A
    {
        public static int X = B.Y + 1;

        static void Main(string[] args)
        {
            Console.WriteLine(X);
        }
    }

    class B
    {
        public static int Z = 10;

        public static int Y;

        static B()
        {
            Console.WriteLine(Z);
            Y = A.X + 1;
        }
    }

 

先看一道常见标题,以下代码的进行结果是怎么?

class A
{
    public static int X = B.Y + 1;

    static void Main(string[] args)
    {
        Console.WriteLine(X);
    }
}

class B
{
    public static int Z = 10;

    public static int Y;

    static B()
    {
        Console.WriteLine(Z);
        Y = A.X + 1;
    }
}

一、定义

  由名称可见,静态构造函数(也叫做类型构造函数)包涵“静态”和“构造函数”七个特点。第多个特点决定了它与静态函数类似,只好动用静态成员;首个特色决定了它与构造函数类似,具有开端化功用,并且没有再次回到值。

  与构造函数(针对实例对象)分裂的是,静态构造函数(针对类)只实行2次,并且是在第三个实例对象创立前被调用,所以它能够用于这个只要求实行一遍的操作;而且它分裂意有public等修饰符,由程序自动调用,无法被外边调用。

  总计:静态构造函数用于初步化任王琴态数据,或然用于施行仅需试行2遍的操作;在创造第二个实例对象大概引用任张凯态变量从前,将机关调用静态构造函数。

  特点:

java静态构造函数,静态构造函数。  壹、静态构造函数既未有访问修饰符,也并未有参数。

  2、在开立第二个实例或引用任吴彤态成员以前,将电动调用静态构造函数来开始化类。

  三、不能直接调用静态构造函数。  

  4、在先后中,用户不能调节什么时候执行静态构造函数。

  5、线程安全。

  关于线程安全须要专门说美赞臣(Meadjohnson)下,由于程序或者在10贰线程情况下运转,相当于唯恐出现同时七个线程绸缪实施静态构造函数的景观。CL索罗德确定保证这么些进度是安全的,实际上调用静态构造函数的线程必要先拿走八个互斥线程同步锁,若是有三个线程试图实践项目的静态构造函数,只有八个线程能获取该锁;拿到锁的线程实现伊始类型伊始化操作,其余线程只好等待;当开始化达成,等待的线程被晋升,然后发掘静态构造函数已经被推行过,就不会再执行。

二、语法  

public class StaticTester
{
    static StaticTester()
    {
    }
}

三、作用

  用于初叶化静态成员。有时候我们会从陈设文件读取一些值作为静态变量,类似那样:  

public class StaticTester
{
    private static readonly string key = ConfigurationManager.AppSettings["key"];
    private static readonly string value = ConfigurationManager.AppSettings["value"];

    static StaticTester()
    {           
    }
}

万1要读取的布置音讯比较多,而且要进入一些逻辑判定,那么能够这么:

public class StaticTester
{
    private static readonly string key;
    private static readonly string value;

    static StaticTester()
    {
        key = ConfigurationManager.AppSettings["key"];
        if (string.IsNullOrEmpty(key))
        {
            throw new Exception("key变量未被正确配置!");                    
        }
        value = ConfigurationManager.AppSettings["value"];
        if (string.IsNullOrEmpty(value))
        {
            throw new Exception("value变量未被正确配置!");
        }
    }
}  

肆、实行顺序

  一. 运维时,优先对静态变量举办开始化。

      二.
要是有静态构造函数,那么在创设第3个实例对象也许引用任张志态变量从前,调用静态构造函数。

  3. 别样操作。

美高梅开户网址 2

3.
在开创第贰个实例或引用任杜扬态成员以前,将机关调用静态构造函数来初始化类。

一、定义

四.
不可能直接调用静态构造函数。

  由名称可见,静态构造函数(也称之为类型构造函数)包罗“静态”和“构造函数”两特特性。第伍个天性决定了它与静态函数类似,只可以采用静态成员;第一本性状决定了它与构造函数类似,具备伊始化成效,并且未有重临值。

5.
万一静态构造函数引发这些,运转时将不会再也调用该构造函数,并且在程序运营所在的采用程序域的生存期内,类型将保持未起先化。

  与构造函数(针对实例对象)分歧的是,静态构造函数(针对类)只举办1回,并且是在第三个实例对象创造前被调用,所以它能够用于那几个只要求实行三次的操作;而且它分化意有public等修饰符,由程序自动调用,不可能被外边调用。

    class Program
    {
        static void Main(string[] args)
        {
            // 在bus1实例化后调用静态构造函数,只调用一次
            Bus bus1 = new Bus(71);
            Bus bus2 = new Bus(72);
            bus1.Drive();
            System.Threading.Thread.Sleep(3600);
            bus2.Drive();
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    public class Bus
    {
        protected static readonly DateTime globalStartTime;
        protected int RouteNumber { get; set; }
        static Bus ()
        {
            globalStartTime = DateTime.Now;
            Console.WriteLine("static constructor sets global start time to {0}", globalStartTime.ToLongTimeString());
        }
        public Bus (int routeNum)
        {
            RouteNumber = routeNum;
            Console.WriteLine("Bus #{0} is created", RouteNumber);
        }
        public void Drive()
        {
            TimeSpan elapsedTime = DateTime.Now - globalStartTime;
            Console.WriteLine("{0} is starting its route {1:N2} minutes after global start time {2}", this.RouteNumber, elapsedTime.TotalMilliseconds, globalStartTime.ToLongTimeString());
        }
    }

  总计:静态构造函数用于初步化任马爱民态数据,恐怕用于实行仅需施行3次的操作;在开立第六个实例对象或然引用任任伟态变量以前,将电动调用静态构造函数。

  

  特点:

  一、静态构造函数既未有访问修饰符,也从没参数。

  二、在创建第三个实例或引用任张健态成员在此以前,将电动调用静态构造函数来开端化类。

  三、不能够直接调用静态构造函数。  

  四、在先后中,用户不能调节何时实践静态构造函数。

  伍、线程安全。

  关于线程安全须求专门说Bellamy下,由于程序大概在二十四线程情状下运作,也正是唯恐出现同时多个线程计划实行静态构造函数的情况。CL瑞虎确认保障这几个进度是平安的,实际上调用静态构造函数的线程供给先获得叁个互斥线程同步锁,若是有多个线程试图施行项目标静态构造函数,唯有一个线程能获得该锁;得到锁的线程达成早先类型初叶化操作,其余线程只可以等待;当初阶化落成,等待的线程被唤醒,然后开采静态构造函数已经被施行过,就不会再奉行。

二、语法  

    public class StaticTester
    {
        static StaticTester()
        {
        }
    }

美高梅开户网址,三、作用

  用于先河化静态成员。有时候大家会从配置文件读取一些值作为静态变量,类似那样:  

    public class StaticTester
    {
        private static readonly string key = ConfigurationManager.AppSettings["key"];
        private static readonly string value = ConfigurationManager.AppSettings["value"];

        static StaticTester()
        {            
        }
    }

  假诺要读取的布署新闻相比多,而且要参加一些逻辑推断,那么能够这么:  

    public class StaticTester
    {
        private static readonly string key;
        private static readonly string value;

        static StaticTester()
        {
            key = ConfigurationManager.AppSettings["key"];
            if (string.IsNullOrEmpty(key))
            {
                throw new Exception("key变量未被正确配置!");                     
            }
            value = ConfigurationManager.AppSettings["value"];
            if (string.IsNullOrEmpty(value))
            {
                throw new Exception("value变量未被正确配置!");
            }
        }
    }  

四、实施顺序

  一. 运转时,优先对静态变量举行开头化。

      二.
比如有静态构造函数,那么在开创第三个实例对象或许引用任张正军态变量在此以前,调用静态构造函数。

  3. 别样操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图