1、静态成员
加“static”关键字的成员即静态成员。
static int num_1 = 0; //静态成员
private int num_2 = 0; //实例成员
静态成员:
静态成员和类相关联,访问时不用指定对象,直接使用“类名+‘.’+成员名”即可。
Class_1.Func_1(); //静态调用
实例成员:
实例成员和对象相关联,访问时需要指定实例对象。
Class_1 class_1 = new Class_1();//实例调用
class_1.Func_2();
静态方法可以访问静态成员变量和静态方法,不可以直接访问实例变量和实例方法。实例方法可以直接访问所有变量和方法,当多个实例对象存在时,内存中并不存在所有特定实例方法的拷贝,而是相同类的所有对象都共享每个实例方法的一个拷贝。
2、静态成员与实例成员的区别
存储区别:
静态成员变量存储于程序的全局变量存储区,其作用域限制为类内部,并且在整个程序运行期间只在内存中拥有一个存储位置,不可拷贝或复制;
实例成员变量存储于对象变量存储区,每个对象都拥有自己的存储区域,每个实例成员只隶属于自己的的对象。
归属区别:
静态成员隶属于类,无论对一个类创建多少个实例,它的静态成员都只有一个副本,在各个地方的改变都会改变其值;
实例成员隶属于它的对象,各自对象对同一个非静态成员值的改变都不互相影响,有多少实例就有多少副本。
生存周期区别:
静态成员在整个程序运行期间都是存在的,程序关闭之后才会被GC回收;
实例成员的生存周期跟随隶属对象,对象消亡就会被回收;
初始化区别:
先初始化类的静态成员,然后才是非静态成员。静态成员只初始化一次。
3、静态类
加“static”关键字的类即静态类,仅包含静态成员,不能使用“ new” 关键字创建静态类的实例。
static class class_1
{
public static string GetName() { return "Name"; }
public static string GetAddress() { return "Address"; }
}
静态类的主要特点如下:
(1) 仅包含静态成员,函数成员和变量都必须加“static”修饰;
(2) 不能被实例化;
(3) 静态类是密封的,编译器编译时自动生成sealed标记;
(4) 不能包含实例构造函数。
静态类与实例类的主要区别是:
(1) 静态类只在内存中创建一次;
(2) 实例类每次实例化都会在内存创建一次。
静态类的优点在于:
(1) 编译器能够确保不会偶然地添加实例成员,以保证不会创建此类的实例。
(2) 静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。
4、应用场景
(1) 在整个应用程序中要共享数据的时候可以使用静态类。
(2) 对于类中包含大量方法且不需要创建对象的场景,可以使用静态类。
(3) 可以把一些常用的工具函数,封装到一个静态类中,使用方便。