CodeGym /课程 /C# SELF /静态字段和方法

静态字段和方法

C# SELF
第 12 级 , 课程 1
可用

1. 对象字段:对象用来存自己数据的地方

在C#(其实大多数编程语言都这样)经常说:“一切皆对象”。对象就是内存里的一个“虚拟物品”,它能存点东西(数据),还能做点事(方法)。换句话说,对象有状态(字段、数据)和行为(方法)。

对象的例子:

  • 游戏里的猫(Cat
  • 网站用户(User
  • 图书馆的书(Book
  • 停车场的车(Car

你创建对象的时候——就像复制了一个模板(类),每个副本都能用自己的数据。

字段——就是“藏在”对象里的变量,用来存它自己的数据。

生活中的例子

每只猫都有名字、年龄、颜色。这些数据都是独立的——每只猫都不一样。


public class Cat
{
    public string Name;  // 猫的名字——对象字段
    public int Age;      // 猫的年龄——对象字段
    public string Color; // 猫的颜色——对象字段
}
对象字段的声明例子

当我们创建对象时:

Cat cat1 = new Cat();
cat1.Name = "巴尔西克";
cat1.Age = 2;
cat1.Color = "灰色";

Cat cat2 = new Cat();
cat2.Name = "穆尔卡";
cat2.Age = 5;
cat2.Color = "黑色";

每个对象都有自己的字段值!

对象 Name Age Color
cat1 巴尔西克 2 灰色
cat2 穆尔卡 5 黑色

字段——就是对象里的“小口袋”,它能往里面塞点东西。

2. 对象方法:对象能干啥

方法——就是对象的“动作”、“技能”或者“函数”。方法就是一段可以被对象“调用”的代码。

生活中的例子

猫有动作:它会喵喵叫,会跑,会吃饭。


public class Cat
{
    public string Name;
    public void Meow()
    {
        Console.WriteLine($"{Name} 说:喵!");
    }

    public void Sleep()
    {
        Console.WriteLine($"{Name} 在睡觉。");
    }
}
对象方法的例子

用法:

Cat cat1 = new Cat();
cat1.Name = "巴尔西克";
cat1.Meow();   // 巴尔西克 说:喵!
cat1.Sleep();  // 巴尔西克 在睡觉。

每个对象都有自己的方法,而且它们用的是自己的字段!

3. 静态字段(static fields):共享数据

有时候你想在字段里存的不是对象自己的数据,而是整个类都共享的信息。比如,统计一共创建了多少只猫,或者给所有猫设一个“最大音量”。

这时候C#里就用静态字段——用static关键字声明。


public class Cat
{
    public string Name;
    public static int Count = 0; // 静态字段

    public Cat(string name)
    {
        Name = name;
        Count++; // 增加猫的总数
    }
}

//和Cat类打交道         
Cat c1 = new Cat("巴尔西克");
Cat c2 = new Cat("穆尔卡");

Console.WriteLine(Cat.Count); // 2 —— 所有对象共享
静态字段的用法例子

静态字段是整个类唯一的,所有对象都“共享”它。
一般用类名来访问:Cat.Count

4. 静态方法(static methods)

静态方法——就是不属于某个具体对象,而是属于整个类的方法。

  • 这种方法不用创建对象就能调用
  • 在静态方法里不能访问普通(非静态)字段和方法——因为根本没有具体对象!

public class MathUtils
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}
静态方法的例子

用法:

int sum = MathUtils.Add(2, 3); // 5

静态方法经常用来写工具函数——那些和对象状态没关系的功能。

你其实已经见过很多静态方法了:

Console.WriteLine();
Console.ReadLine();

Math.Round();
Math.Truncate();

5. 字段和方法对比

这是什么? 怎么声明? 存哪? 干啥用? 怎么访问?
对象字段
public string Name;
每个对象里 对象自己的数据 cat1.Name, cat2.Name
对象方法
public void Meow(){}
每个对象里 用对象字段的动作 cat1.Meow()
静态字段
public static int C;
整个类唯一一个 所有对象共享的数据 Cat.C
静态方法
public static ...
整个类唯一一个 和对象无关的“技能” Cat.Method()

7. 图解

普通字段和方法:


.     +-----------------+
cat1: | Name = "巴尔西克" |
      | Age = 2         |
      +-----------------+

      +------------------+
cat2: | Name = "穆尔卡"   |
      | Age = 5          |
      +------------------+

静态字段Count:

Cat.Count = 2    // 所有猫共享的唯一一个

方法调用:

cat1.Meow();   // 巴尔西克 说:喵!
cat2.Meow();   // 穆尔卡 说:喵!

静态方法调用:

MathUtils.Add(2, 3); // 5

总结

  • 字段——负责每个对象自己的属性。
  • 方法——描述对象能干啥。
  • 静态字段——适合存“全局”数据(比如计数器、全局设置)。
  • 静态方法——用来做和具体对象没关系的操作(比如数学函数)。

8. 常见问题

能不能通过对象访问静态字段?
技术上——可以(cat1.Count),但一般都用类名(Cat.Count),这样自己和别人都不容易搞混。

能不能不创建对象就调用非静态方法?
不行,因为这种方法总是和具体对象、它的数据打交道。

静态方法里能用普通字段和方法吗?
不能——因为静态方法根本不知道该找哪个对象。

能不能做个“全静态”的类?
可以,写static class就行——这种类不能用new创建,里面所有成员都得是静态的。

2
任务
C# SELF, 第 12 级, 课程 1
已锁定
用于统计对象数量的静态字段
用于统计对象数量的静态字段
2
任务
C# SELF, 第 12 级, 课程 1
已锁定
用于检查数字的静态方法
用于检查数字的静态方法
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION