核心概念与关系解析
非静态成员(实例成员)属于某个具体对象的特征或行为。比如“人”这个类,每个人(对象)都有自己的姓名、年龄,这些就是实例成员。
静态成员(static)属于整个类的特征或行为,所有对象共享。比如“人”这个类的“物种名称”是“人类”,这个属性对所有“人”对象都一样,就适合定义为静态成员。
核心访问规则
静态与非静态之间最核心的关系总结为两条规则:
| 非静态方法/属性 | ✅ 可以直接访问 | ✅ 可以直接访问 |
| 静态方法/属性 | ❌ 不能直接访问 | ✅ 可以直接访问 |
静态成员属于类本身,在程序启动后、还没创建任何对象时就已经存在;而非静态成员必须创建对象后才存在。静态方法执行时,可能根本没有任何对象,自然无法访问“不存在”的实例成员。
代码示例
通过一个完整的代码示例,演示静态与非静态的访问规则:
using System;
public class Student
{
public string Name;
public static string SchoolName = "北京大学";
public void ShowStudentInfo()
{
Console.WriteLine($"姓名:{this.Name}");
Console.WriteLine($"学校:{SchoolName}");
}
public static void ShowSchoolInfo()
{
Console.WriteLine($"学校名称:{SchoolName}");
Student tempStudent = new Student();
tempStudent.Name = "张三";
Console.WriteLine($"示例学生姓名:{tempStudent.Name}");
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("直接访问静态成员:" + Student.SchoolName);
Student.ShowSchoolInfo();
Student student1 = new Student();
student1.Name = "李四";
student1.ShowStudentInfo();
Student student2 = new Student();
student2.Name = "王五";
Student.SchoolName = "清华大学";
student1.ShowStudentInfo();
student2.ShowStudentInfo();
}
}
补充说明
- 静态类:标记为static的类只能包含静态成员,且不能被实例化。比如C#中的Math类。
- 静态构造函数:用于初始化静态成员,只会执行一次,不能有参数。
- 使用场景:
- 静态成员:工具方法、全局共享的常量、统计类数据。
- 非静态成员:对象的个性化属性或行为。
总结
非静态成员可直接访问静态或非静态成员;静态成员只能直接访问静态成员,访问非静态成员必须先创建对象。
非静态成员属于对象,静态成员属于类且被所有对象共享。
静态成员用于全局共享或工具类逻辑,非静态成员用于对象的个性化特征。



