一、静态成员的本质
1.概念:
用static修饰的成员变量、方法、属性等
静态成员属于类本身,而不是类的实例。想象成一个班级的公共财产:
-
实例成员:每个学生(对象)自带的书包(每个对象独有)
-
静态成员:教室里的公共黑板(所有对象共享)
示例:
class Student {
public string Name; // 实例成员(每个学生自己的名字)
public static int Count; // 静态成员(统计学生总数)
}
2.特点:
不需要创建对象,通过类名直接访问:
示例:
Student.Count = 10; // ✅ 直接使用
Student stu = new Student();
stu.Name = "小明"; // ✅ 实例成员需要对象
二、静态成员的使用
静态成员可以直接通过类名点出来使用,实例成员需要实例化对象,通过对象名来点出使用。
using System;
namespace C_面向对象
{
class Test
{
//静态成员变量
public static float PI = 3.1415926f;
//实例成员变量
public int testInt = 100;
//静态方法
public static float CalcCircle(float r)
{
return PI * r *r;
}
//实例方法
public void TestFun()
{
Console.WriteLine("/实例方法");
}
}
internal class Program
{
static void Main(string[] args)
{
//静态成员使用
//直接类名点出使用
Console.WriteLine(Test.PI);
Console.WriteLine(Test.CalcCircle(2));
//实例成员使用
//需要实例化出一个对象
Test t = new Test();
Console.WriteLine(t.testInt);
t.TestFun();
}
}
}
三、为什么可以直接通过类名来点出使用
1.解释:
我们都知道,程序中是不能无中生有的,我们要使用的对象,变量,函数都是要在内存中分配内存空间的,之所以要实例化对现象,目的是分配内存空间在程序中产生一个抽象的对象。
依据静态成员的特点,
程序在开始运行时就会为静态成员分配内存空间,所以可以直接使用。
静态函数中不能使用实例成员(非静态成员)。
实例成员函数可以使用静态变量。
2.注意:
静态成员与程序同生共死,只要使用了它,直到程序结束是内存空间才会被释放,所以,一个静态成员就会有自己唯一的一个“内存小空间”,这让静态成员有了唯一性。
在任何时候使用都是用的“小房间”里的内容,改变了它也是改变“小房间”里的内容。
3.静态成员与实例成员的区别:
详细来说,
1)、内存分配原理
1.类级别的存储
-
静态变量在程序加载类时就被分配内存(位于静态存储区)
-
实例变量只有在对象创建时才会分配内存(位于堆内存)
2.生命周期不同
-
静态变量生命周期 ≈ 程序运行周期
-
实例变量生命周期 ≈ 对象存活周期
class MyClass {
public int InstanceValue; // 实例变量:随对象创建/销毁
public static int StaticValue; // 静态变量:程序启动到结束存在
}
2)、访问机制对比
访问方式 | 静态变量 | 实例变量 |
---|---|---|
内存准备时机 | 类首次被访问时初始化 | 对象实例化时初始化 |
访问依赖 | 无需对象实例 | 必须通过对象实例 |
数据副本数量 | 全类共享唯一副本 | 每个对象独立副本 |
示例:
// 静态变量直接通过类访问
MyClass.StaticValue = 10; // ✅
// 实例变量必须通过对象
MyClass obj = new MyClass();
obj.InstanceValue = 20; // ✅
四、静态成员的作用
静态变量
1.常用唯一的变量申明。
2.方便别人获取对象申明。
静态方法
常用的唯一的方法申明,比如相同规则的数学计算相关的函数。
五、常量和静态变量
const(常量) 可以理解为特殊的static(静态)
相同点:
他们都可以通过类名直接点出使用。
不同点:
1.const必须初始化,不能修改,static没有这个规则。
2.const自能修饰变量,static可以修饰很多。
3.const一定要写在访问修饰符的后面,static 没有这个要求。
六、总结
概念:用static修饰的成员变量、成员方法、成员属性等就成为静态成员。
特点:直接用类名点出(全局性)。
生命周期:和程序同生共死(程序运行后会一直存在在内存中,直到程序结束,具有唯一性)。
注意:
静态函数中不能使用实例成员(非静态成员)。
实例成员函数可以使用静态变量。
常量与静态变量区别:
const(常量) 可以理解为特殊的static(静态)
相同点:
他们都可以通过类名直接点出使用。
不同点:
1.const必须初始化,不能修改,static没有这个规则。
2.const自能修饰变量,static可以修饰很多。
3.const一定要写在访问修饰符的后面,static 没有这个要求。