- 什么是静态和非静态
有static关键字修饰,静态类、静态成员(字段、属性、方法) - 静态类
public static class Math//静态类
{
public static int a;//静态字段
public static int MyProperty { get; set; }//静态属性
public static void Add()//静态方法
}
注意:静态类不能被实例化,没有构造方法,成员全部为Static
- 非静态类
定义非静态类
public class Math//非静态类
{
public static int a;//静态字段
public int b;//非静态字段
public static int MyProperty { get; set; }//静态属性
public int MyProperty1 { get; set; }//实例属性
public static void Add()//静态方法
public void AAA()//实例方法
}
使用非静态类
Math.a = 1;//直接利用类名访问静态成员,不能访问实例成员
Math math = new Math();
math.b = 1;//利用对象访问实例成员,不能访问静态
注意:非静态类成员无要求,访问有区别,有构造函数
- 静态字段和属性
定义静态和非静态字段,属性:
public static int a;//静态字段
public int b;//非静态字段
使用
Math.a = 1;//直接利用类名访问静态字段或属性
Math math = new Math();
math.b = 1;//利用对象访问实例字段或属性
注意:静态用类名,实例用对象
-
常规做法
业务相关的类(线路、信号机)Public Class LIne(){ 类成员}
工具类:Static,方便调用
对于类中经常需要调用的方法 ,public Static Void Add()(方法体) -
原理
资源的占用,静态类在整个项目中资源共享,只分配一次内存,实例类实例化一个对象需要new出一个内存。
静态的缺点:占用资源在系统结束时才释放,非静态台有垃圾自动回收机制。 -
静态成员为公有的内存,不同的对象都用,产生线程安全
之前的错误:实例对象不能访问静态成员,怎么改动静态成员的值?
答:对象中的实例方法可以使用静态成员,在方法体中赋值、运算。不同的对象同时操作同一静态成员,会产生线程安全
定义静态和非静态成员
public class Math//静态类
public static int a;//静态字段
public int b;//非静态字段
public void AAA()//实例方法
{
Console.WriteLine("实例字段:{0},静态字段{1}",b++,a++);
}
使用成员
Math math = new Math();
math.AAA();
Math math2 = new Math();
math2.AAA();
输出
实例字段:0,静态字段0
实例字段:0,静态字段1