zoukankan      html  css  js  c++  java
  • c#中静态成员和实例成员(转)

    7.5  静态成员与实例成员

    在类的成员的类型或者返回值类型前面加上关键字static,就能将该成员定义为静态成员(static member)。常量或类型声明会隐式地声明为静态成员,其他没有用static修饰的成员都是实例成员(instance member)或者称为非静态成员。静态成员属于类,被这个类的所有实例所共享;实例成员属于对象(类的实例),每一个对象都有实例成员的不同副本。

    静态成员具有下列特征:

    — 静态成员必须通过类名使用 . 运算符来引用,而不能用对象来引用。

    — 一个静态字段只标识一个存储位置。无论创建了一个类的多少个实例,它的静态字段在内存中都只占同一块区域。

    — 静态函数成员(方法、属性、事件、运算符或构造函数)不能作用于具体的实例,在这类函数成员中不能直接使用实例成员,必须通过类名来引用。

    实例成员具有以下特点:

    — 实例成员必须通过对象名使用 . 运算符来引用,而不能用类名来引用。

    — 类的实例字段属于类的实例所有,每创建一个类的实例,都在内存中为实例字段开辟了一块区域。类的每个实例分别包含一组该类的所有实例字段的副本。

    — 实例函数成员(方法、属性、索引器、实例构造函数或析构函数)作用于类的给定实例,在它们的代码体内可以直接引用类的静态和实例成员。

    其实,我们在前面的几章中大量使用的Console类的WriteLine等方法都是静态方法,都是通过类名Console来引用的。

    理解下面的代码,体会静态成员和实例成员的使用方法:

    class Test

    {

        int x;             // 实例字段

        static int y;         // 静态字段

        void F()              // 实例方法

        {

            x = 1;             // 正确:实例方法内可以直接引用实例字段

            y = 1;             // 正确:实例方法内可以直接引用静态字段

        }

        static void G()       // 静态方法

        {

            x = 1;             // 错误:静态方法内不能直接引用实例字段

            y = 1;             // 正确:静态方法可以直接引用静态字段

        }

        static void Main()       // 静态方法

        {

            Test t = new Test();  // 创建对象

            t.x = 1;           // 正确:用对象引用实例字段

            t.y = 1;           // 错误:不能用对象名引用静态字段

            Test.x = 1;        // 错误:不能用类名引用实例字段

            Test.y = 1;        // 正确:用类名引用静态字段

            t.F();             // 正确:用对象调用实例方法

            t.G();             // 错误:不能用对象名调用静态方法

            Test.F();          // 错误:不能用类名调用实例方法

            Test.G();          // 正确:用类名调用静态方法

        }

    }

    注意  上述代码中,Main也是Test类的静态方法,可以在其中直接使用静态成员,而不需要使用类名来引用。

    下面的程序演示了静态字段的性质:

    // StaticMember.cs

    // 静态字段的例子

    using System;

    public class Count

    {

        static int count;

        int number;

        public Count()

        {

            count = count + 1;

            number = count;

        }

        public void show()

        {

            Console.WriteLine("object{0} : count={1}", number, count);

        }

    }

    class Test

    {

        public static void Main()

        {

            Count a = new Count();

            a.show();

            Console.WriteLine("-----------------");

            Count b = new Count();

            a.show();

            b.show();

            Console.WriteLine("-----------------");

            Count c = new Count();

            a.show();

            b.show();

            c.show();

        }

    }

    其输出结果为:

    object1 : count=1

    -----------------

    object1 : count=2

    object2 : count=2

    -----------------

    object1 : count=3

    object2 : count=3

    object3 : count=3

    从上面的例子中可以看出,无论何时,类的所有实例的静态字段count的值都是相同的,一个实例改变了它的值,其他实例得到的值也将随之变化,说明所有实例都使用同一个count字段;而每个实例的成员字段number的值都是不同的,也不能被其他的实例化改变。

  • 相关阅读:
    (转)Linux系统中sysctl命令详解 sysctl -p、sysctl -a、sysctl -w
    EM2 MP1 Vowel and Consonant Teacher:Ashley
    Phonics 自然拼读法 y,x,ch,sh,(voiced)th/ð/ ,(unvoiced) th/θ/ Teacher:Lamb
    java列表转成 int[] 的格式
    分类模型评估之ROC-AUC曲线和PRC曲线
    hive 抽样方法
    AUC理解
    Spark性能调优——基础篇
    scala 稀疏向量
    scala 建模
  • 原文地址:https://www.cnblogs.com/treasurelife/p/1076094.html
Copyright © 2011-2022 走看看