细谈静态类和实例类的区别

一:首先介绍下静态成员和实例成员的区别

说明:
静态成员也称为共享成员,例如静态属性 静态字段 静态方法;静态成员可以在类的实例之间共享。

静态类中只能有静态成员,不能有实例成员,因为静态类不能进行实例化;

在非静态类中 即可以有静态成员 也可以有非静态成员;

只要是静态成员 属性 字段 方法,都需要用类名去调用;

以下两种情况下定义静态变量

①变量需要被共享的时候
②方法需要被反复的调用的时候

区别
静态成员需要通过static修饰,非静态成员不需要通过static修饰;

静态成员属于类,可以直接通过“类名.静态成员”的方式访问;

非静态成员,必须实例化对象后,通过对象.实例成员来访问;

当类第一次加载的时候(第一次被加载到内存的时候),该类下的所有的静态成员都会被加载,实例成员有多少个对象,就会创建多少个对象;静态成员会被加载到静态存储区,直到程序退出时才会被释放;
静态成员是需要通过static关键字来修饰的:

  static void Main(string[] args)
        {
            //student st = new student();
            //st.Run();
            //st.Run("跑", 35, "35m/秒");
            //st.Run("", 25, "", "");
            //Console.WriteLine(st);
            zxc za;
            za.i = 32;
            Console.WriteLine(za.i);
            zxc z = new zxc(20);
            z.I = 200;
            Console.WriteLine(z.I);
            Console.ReadKey();
        }

实例成员属于对象,需要通过“对象名.实例成员”来访问:

 static void Main(string[] args)
        {
            student st = new student();
            st.Run();
            st.Run("跑", 35, "35m/秒");
            st.Run("", 25, "", "");
            Console.WriteLine(st);
            //zxc za;
            //za.i = 32;
            //Console.WriteLine(za.i);
            //zxc z = new zxc(20);
            //z.I = 200;
            //Console.WriteLine(z.I);
            Console.ReadKey();
        }

二:静态构造函数和实例构造函数的区别

实例构造函数:

1):若构造函数有修饰符extern,则表示该构造函数为外部构造函数,外部构造函数不提供任何实际的实现,函数体中仅由一个分号组成。一般情况下,构造函数总是public类型,若为private类型,表明类不能被实例化。

2):实例构造函数可以重载。(abstract override)

3)::base([参数列表])表明调用基类中相应的构造函数。

4)::this([参数列表])表明调用该类本身所声明的其他构造函数。

5):构造函数中既可以对静态字段进行赋值,也可以对非静态字段进行初始化。

6):实例构造函数不能被继承。若一个类中没有声明任何实例构造函数,系统会自动提供一个不带参数的默认构造函数。

静态构造函数:

1):静态构造函数主要用于初始化一些静态的变量。静态构造函数只会执行一次,而且是在创建此类的第一个实例 或 引用任何静态成员(包括静态方法)之前,由.NET自动调用。

2):静态构造函数没有访问修饰符, 因为是由.NET自动调用的。

3):静态构造函数没有参数。

4):一个类中只能有一个静态构造函数。

5):静态构造函数只能运行一次。

6):静态构造函数不能被继承。

7):若没有写静态构造函数,而类中包含有初始值设定的静态成员,则编译器会自动生成默认的构造函数。

8):静态构造函数与无参的实例构造函数不冲突,可同时出现。
  
细谈静态类和实例类的区别_第1张图片
***注意:***实例方法的存在必须要有对象实例的存在,如果对象实例不存在,则实例方法也就没有调用它的主人。静态方法的存在前提是类的存在,所以无需声明和New对象。

你可能感兴趣的:(C#,类)