🐸 青蛙编程网
首页 / C# / 面向对象 / 1. 类与对象

类与对象

这是什么:类(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 一声,汪汪有。

动手改

  1. 给 Dog 加一个 string Color 字段,构造函数多收一个颜色参数,打印"旺财 是黄色的"
  2. 加一个 Birthday() 方法,让 Age 加 1 并输出"XX 过生日啦,现在 X 岁"
  3. 再 new 一只你自己起名的狗,让它和另外两只都叫一声

下一章:属性与方法,把裸奔的字段升级成带门卫的"属性" 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。