跳转至

静态成员#

来源:D:\study\C#1\stu0724


一、静态成员 vs 非静态成员#

核心区别#

对比项 静态成员 (static) 非静态成员(实例成员)
访问方式 类名.成员名 对象名.成员名(需先实例化)
存储位置 存储在上,所有对象共享同一份 每个实例化对象各有一份
生命周期 类加载时创建,程序结束时销毁 对象创建时创建,GC 回收时销毁
能否访问非静态 ❌ 静态方法只能访问静态成员 ✅ 可以访问静态和非静态成员

示例 1:People 类 — 静态与实例成员对比#

namespace st0724
{
    class People
    {
        // ── 非静态成员 ──
        public int Id { get; set; }
        public string Name { get; set; }
        public void Test()
        {
            Console.WriteLine("非静态");
            Test00();  // 非静态方法可以调用静态方法
        }

        // ── 静态成员 ──
        public static string Name2 { get; set; }
        public static void Test00()
        {
            Console.WriteLine("静态方法");
            // Console.WriteLine(Name);  // ⚠️ 编译错误:静态不能访问非静态成员
        }
    }
}

访问方式:

// 非静态成员 — 需要实例化对象
People p = new People();
p.Id = 12;

// 静态成员 — 直接通过类名访问
People.Name2 = "";

⚠️ 注意:静态成员属于类本身,不属于任何实例。调用静态方法时,方法内部无法使用 this 引用,也无法直接访问实例字段/属性。


二、静态成员的共享特性演示#

示例 2:非静态计数器 vs 静态计数器#

namespace test
{
    class Test  // 非静态计数器
    {
        int num = 0;
        public void Add() { num++; }
        public void Show()
        {
            Console.WriteLine(num + "非静态成员");
        }
    }

    class Test2  // 静态计数器
    {
        static int num = 0;
        public void Add() { num++; }
        public void Show()
        {
            Console.WriteLine(num + "静态成员");
        }
    }
}

运行对比:

// ── Test(非静态)──
Test t1 = new Test();
Test t2 = new Test();
t1.Add();    // t1.num = 1
t1.Show();   // 输出 "1非静态成员"  ← 只有 t1 自己的 num
t2.Show();   // 输出 "0非静态成员"  ← t2 的 num 仍然是 0

// ── Test2(静态)──
Test2 test = new Test2();
Test2 test2 = new Test2();
test.Add();      // num = 1  (所有对象共享同一个 num)
test2.Add();     // num = 2
test.Add();      // num = 3
test.Show();     // 输出 "3静态成员"  ← test 和 test2 操作的是同一个 num

关键理解:非静态成员每个对象独立拥有一份;静态成员所有对象共用一份,无论哪个对象操作,修改的都是同一份数据。


相关笔记#