zoukankan      html  css  js  c++  java
  • 静态类和静态构造函数

    静态构造函数和静态类

    静态构造函数的几点注意:

    一. 一个类只能定义一个静态构造函数。换句话说,静态构造函数不能被重载。

    二. 静态构造函数不允许访问修饰符并且不能接受任何参数。

    三. 无论创建了多少类型的对象,静态构造函数只执行一次。

    四. 运行库创建类实例或调用者首次访问静态成员之前,运行库会调用静态构造函数。

    五. 静态构造函数的执行先于任何实例级别的构造函数。

    补充一下静态类的定义:

    在类级别添加关键字“static"。 如果一个类被定义成静态的,就不能使用"new"关键字来创建

    并且只能包含用static关键字标记的成员或字段。

    静态类中只能有静态成员,而一般类中可以有静态成员也可以有其它非静态成员。

    引用:http://www.cnblogs.com/rarry/archive/2012/04/27/2474336.html

    二,

    构造函数一般用于在创建对象时,初始化其数据。对于静态成员如果也在一般的构造函数初始化,就失去了静态成员在类级别使用的好处,因为每次实例化一个对象那么静态成员就被重置了一次。比如

        public class MathUtitlity

        {

            public static double PI;

            public MathUtitlity()

            {

                PI = 3.14;

            }

    }

    创建两个不同的实例(对象),

    MathUtitlity math = new MathUtitlity();

    MathUtitlity math2 = new MathUtitlity();

    这样PI就被设置了两次,这样的话,何必要将PI声明为静态成员呢?

    当然有一种解决方案,直接在声明静态成员时,同时初始化

    public static double PI=3.14;

    去掉构造函数相应的初始化语句;但是我也想在运行时初始化,而且不管有多少个实例,只初始化一次。静态构造函数可以满足这个需求。

            static MathUtitlity()

            {

                PI = 3.14;

            }

    当编译时不知道静态成员的值时,静态构造函数是一个理想地方来初始化静态成员数据。使用静态构造函数时,需要注意几点

    1.      一个类中,最多只能有一个静态构造函数,不允许静态构造函数的重载;
    2.      不能加任何访问修饰符(public/private/internale等),且不能带有任何参数;
    3.      不管创建该类的多少实例,该函数值调用一次;
    4.      运行时环境在创建第一个实例时或者在调用任何静态成员之前调用静态构造函数;
    5.      它先于任何实例构造函数被调用;

     对应的C#提供了静态类的相关语法。静态类主要使用于那些工具类或者工具类,不需要实例化,暴露的方法即为一个功能,比如FCL中的Math类即为一个静态类。

    静态类只能包含静态成员,包含非static成员会发生编译错误。静态类可以与静态构造函数一起使用,例如

        public static  class MathUtitlity2

        {

            public static double PI;

            public static double E = 2.782;

     

            static MathUtitlity2()

            {

                PI = 3.14;

            }

     

            public static double AreaOfCircle(double radius)

            {

                return PI * radius * radius;//计算圆的面积

            }

    }

     

    直接调用

    Console.WriteLine(MathUtitlity2.AreaOfCircle(2.0));

    引用:http://blog.sina.com.cn/s/blog_4b0020f30100v6zl.html

  • 相关阅读:
    算法设计--从后向前处理
    野指针的危害究竟在哪里?
    printf参数的问题
    C++运算符详解问题详解
    java Clone 的心得记录
    拜占庭将军问题
    Java中的private protected public和default的区别
    Mybatis 学习笔记1 不整合Spring的方式使用mybatis
    Mybatis 使用maven插件mybatis-generator自动生成entities和SQL和mapper
    Mybatis 复习 Mybatis 配置 Mybatis项目结构
  • 原文地址:https://www.cnblogs.com/jimcsharp/p/3627605.html
Copyright © 2011-2022 走看看