类与对象
这是什么:类(class)是一张"图纸",对象(object)是照图纸造出来的实物——这就是面向对象。
为什么用:前置:C# 基础,变量、循环都玩顺了?可要用散装变量存三只狗的姓名年龄,很快就是六个变量乱成一锅粥。
如何用:本章先画一张 Dog 类的图纸,再 new 出几只狗,让每只狗都会叫,体会对象之间互不干扰。
类是图纸,对象是实物
想给程序加几只狗。狗有名字、年龄,还会叫——要是用散装变量存,三只狗就是六个变量,乱成一锅粥。类(class)就是一张"狗的图纸",把数据和动作打包在一起;照图纸 new 出来的每一只具体的狗,就叫对象(object)。
- 类:定义"狗长什么样、会干什么",只写一次
- 对象:一只只具体的狗,要几只有几只
第一张图纸:Dog 类
// 程序入口:先 new 两只狗出来
Dog wangcai = new Dog("旺财", 2);
wangcai.Bark();
Dog dahuang = new Dog("大黄", 3);
dahuang.Bark();
Console.WriteLine($"{wangcai.Name} 今年 {wangcai.Age} 岁");
// 图纸:Dog 类
class Dog
{
// 字段:每只狗自己的数据
public string Name;
public int Age;
// 构造函数:new 的时候自动执行,负责"登记出生信息"
public Dog(string name, int age)
{
Name = name;
Age = age;
}
// 方法:狗会做的事
public void Bark()
{
Console.WriteLine($"{Name}:汪汪!");
}
}
运行输出:
旺财:汪汪!
大黄:汪汪!
旺财 今年 2 岁
两只狗互不打扰:wangcai.Name 是"旺财",dahuang.Name 是"大黄"——同一张图纸,各造各的狗。
代码里都有些什么
| 部件 | 写法 | 作用 |
|---|---|---|
| 类 | class Dog { ... } |
图纸:把字段和方法打包 |
| 字段 | public string Name; |
对象身上存的数据 |
| 构造函数 | public Dog(string name, ...) |
名字和类同名、不写返回类型;new 时自动调用 |
| 对象 | new Dog("旺财", 2) |
按图纸造一只具体的狗 |
| 用成员 | wangcai.Bark() |
点号取对象身上的东西:数据或动作 |
public表示"对外公开",别处才能访问。现在先照抄,下一章细讲。
多一只狗:对象彼此独立
继续 new 出第三只狗,验证每只对象数据独立:
Dog xiaohei = new Dog("小黑", 5);
xiaohei.Bark(); // 小黑:汪汪!
Console.WriteLine($"{xiaohei.Name} 今年 {xiaohei.Age} 岁"); // 小黑 今年 5 岁
wangcai、dahuang、xiaohei 三只狗各有自己的 Name 和 Age,互不干扰。
记忆口诀
类是图纸,对象是狗;new 一声,汪汪有。
❓ 常见问题
Q1:类里的字段为什么要加 public?
public 表示"对外公开",程序其他地方才能通过 dog.Name 读写。不加 public 默认是 private(私有),只能在类内部用,外面碰不着。入门阶段先统一加 public,下一章会讲更精细的访问控制。
Q2:构造函数为什么不写返回类型?
构造函数是特殊方法,名字必须和类完全一样,故意不写返回类型(连 void 都不写),因为它不"返回"任何东西,它的工作是"把新对象初始化好"。
Q3:一个文件里能定义多个类吗?
可以。但入门阶段建议"一个文件一个公开类",避免混淆。本教程的示例都把类和入口代码写在同一个 Program.cs 里,方便直接运行。
⚠️ 新手翻车现场
翻车一:忘了 new,直接用类名当对象
// 错误:Dog 是图纸,不是狗本尊
Dog.Bark(); // ❌ 编译报错
问题:类是图纸,不能直接调方法;必须先 new 出对象,再用对象调方法。
修正:Dog wangcai = new Dog("旺财", 2); wangcai.Bark();
翻车二:构造函数参数个数对不上
Dog d = new Dog("旺财"); // ❌ 构造函数要求 (string name, int age),少传了 age
问题:构造函数定义了两个参数,new 时必须传两个值。
修正:new Dog("旺财", 2),参数个数和类型都要对上。
翻车三:忘了分号或大括号
class Dog {
public string Name // ❌ 漏了分号
}
问题:C# 每条语句要以分号结尾,类和方法体要用大括号包起来。
修正:补上分号和匹配的大括号,编译器报错通常会直接指向漏掉的位置。
🎯 什么时候用类
- 一组数据和一组操作天然绑定(如"狗"有名字年龄,会叫)
- 需要创建多个拥有相同结构但数据不同的对象
- 想把相关数据和行为封装在一起,代码更整洁
📝 本章小结
- 类是图纸,对象是产品;
new按图纸造对象 - 构造函数与类同名、无返回类型,
new时自动执行 - 字段存数据,方法定行为,用
.访问对象成员 - 每个对象数据独立,互不干扰
- 记忆口诀:类是图纸,对象是狗;new 一声,汪汪有。
动手改
- 给
Dog加一个string Color字段,构造函数多收一个颜色参数,打印"旺财 是黄色的" - 加一个
Birthday()方法,让Age加 1 并输出"XX 过生日啦,现在 X 岁" - 再 new 一只你自己起名的狗,让它和另外两只都叫一声
下一章:属性与方法,把裸奔的字段升级成带门卫的"属性" 🐸