zoukankan      html  css  js  c++  java
  • static学习笔记

    蓦然发现,脑子里对关键字static是一滩浆糊,只知道是表示静态,具体该用在什么场合,用了有什么好处和坏处等,说不清道不明。作为开发人员真汗颜啊。。。赶紧学习一下

    static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。

    静态类:

    1.仅包含静态成员

    静态类中的所有成员必须是静态的,静态类不能包含实例成员。

    常数或者类型声明隐式地是静态成员,除此之外,静态类成员都应该加static修饰符。

        static class CompanyEmployee
        {
            static string member;
            const string member2 = "test";
            public static void DoSomething() { /*...*/ }
            public static void DoSomethingElse() { /*...*/  }
        }

    2.不能被实例化

    不能使用new关键字创建静态类的实例。

    3.是密封的

    不能继承一个静态类。

    4.不能包含实例构造函数

    可以包含静态构造函数。静态构造函数可以用于静态类,也可以用于非静态类。静态构造函数无访问修饰符无参数,只有一个static标志。静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。

        static class Cat
        {
            private static int statics = 0;
            static Cat()
            {
                statics++;
            }
            public static void HowManyCats()
            {
                Console.WriteLine("{0} cats adopted", statics);
            }
        }
        public class Tester
        {
            static void Main()
            {
                Cat.HowManyCats();
                Cat.HowManyCats();
                Console.ReadKey();
            }
        }

    结果:

    1 cats adopted

    1 cats adopted

    5. 静态与非静态的性能比较

    静态的从程序一启动就会一直占用内存,而非静态的只在实例化后才会占用内存,但是每实例化一个对象时就会占用一份内存。

    6. 何时使用静态类?

    当类中没有依赖对象标识的数据或行为时,就可以使用静态类。当类中有依赖对象标识的数据或行为时,就不能使用静态类。

    经常调用的类,应该设计成静态的。不经常调用的类,应该设计成非静态的。

    静态成员

    静态成员通常用于表示不会随对象状态而变化的数据或计算,无论对象发生什么更改,静态成员都不会随之变化。

    不需要创建类的实例就可以调用该类中的静态方法、字段、属性或事件。

    如果创建了类的实例,不能通过使用实例来访问静态成员。

    静态方法和属性只能访问静态字段和静态事件。静态方法调用非静态的方法,必须先实例化一个对象。

    静态类的一个重要特点就是共享,所以通常使用静态变量来保存当前类的实例数目。

        class Cat
        {
            private static int statics = 0;
            public Cat()
            {
                statics++;
            }
            public static void HowManyCats()
            {
                Console.WriteLine("{0} cats adopted", statics);
            }
        }
        public class Tester
        {
            static void Main()
            {
                Cat.HowManyCats();
                Cat cat1 = new Cat();
                Cat.HowManyCats();
                Cat cat2 = new Cat();
                Cat.HowManyCats();
                Cat.HowManyCats();
                Console.ReadKey();
            }
        }

    结果:

    0 cats adopted

    1 cats adopted

    2 cats adopted

    2 cats adopted

    不可以使用this来引用静态方法或属性访问器

    若要访问静态成员,应该使用类名而不是变量名来指定该成员的位置

    public class Automobile
    {
        public static int NumberOfWheels = 4;
        public static int SizeOfGasTank
        {
            get
            {
                return 15;
            }
        }
        public static void Drive() { }
        public static event EventType RunOutOfGas;

        //other non-static fields and properties...
    }

    访问写法:
    Automobile.Drive();
    int i = Automobile.NumberOfWheels;
  • 相关阅读:
    2014.7建兰NOIP模拟Day1 Running
    简单的数论函数模板
    二分图匹配的匈牙利算法
    手算平方根
    ...
    hdu 5396 Expression(区间DP+组合数)
    hdu 5693 D Game(区间DP)
    hdu 5151 Sit sit sit(区间dp+排列组合)
    hdu 4570 Multi-bit Trie(dp)
    hdu 2855 Fibonacci Check-up (矩阵)
  • 原文地址:https://www.cnblogs.com/niuniu1985/p/2290206.html
Copyright © 2011-2022 走看看