构造函数
写一个类 Box,带 int 字段 size 和构造函数 Box(int n),其中执行 size = n;。在 Pine 里保留 Main,用 Box b = new Box(4); 建出一个 box,再写出 b.size。两种类型放在同一教学文件里,这样 dotnet run 仍然简单。用 dotnet run 运行。屏幕应显示一行:4。你传给 new 的数字会到达构造函数,构造函数在 Main 继续之前把它存到对象上。在构建时——在构造函数内部——设置字段,就是本页要教的内容。请把启动用的公共类名保持为 Pine。
在 new 建出时运行的方法
构造函数与类同名。它没有 void 返回类型,也没有其他返回类型。当 Main 写 new Box(4) 时,C# 建出对象,并以 4 作为 n 运行该构造函数。构造函数结束后,变量持有就绪的对象。本页的全部工作就是:把值传给 new,让构造函数存到字段上,再写出字段,以便看到存储已生效。
打开 Pine 文件。启动类名保持 Pine。本页不重命名启动类。若 Main 里仍全是残留的 c.fill = 3; 这种 Cup 赋值,删掉它。删掉任何残留的 Cup 类。删掉任何 ReadLine 行。你保留的文件不等待键入。
在 Pine 的花括号之外——仍在同一文件里——写下 public class Box。在花括号里声明 int size;。然后写构造函数:Box(int n) { size = n; }。本页不要让参数名与 size 相同,这样无需 this 也能看清赋值。本页的 Box 里没有 Main。运行前先保存文件。
仅有字段行并不会把 4 放进对象。new 调用时,构造函数体才做这件事。若跳过构造函数只声明字段,后来的 new Box(4) 将不匹配,生成会抱怨该调用。请在 Box 里保留两块:字段,以及写入它的构造函数。
using System;
public class Box
{
int size;
Box(int n)
{
size = n;
}
}
Pine 把 4 传进 new Box
Pine 保留 public static void Main()。在 Main 里写 Box b = new Box(4);,再写 Console.WriteLine(b.size);。参数 4 进入构造函数参数 n。本页不需要单独的 b.size = 4; 行——构造函数已经存好了值。写出行是为了让你不必猜测就能相信构造函数做了什么。本页不写 c.fill = 3;。那是字段一课。
using System;
public class Pine
{
public static void Main()
{
Box b = new Box(4);
Console.WriteLine(b.size);
}
}
public class Box
{
int size;
Box(int n)
{
size = n;
}
}
从顶部读保留的文件。using System; 准备短名称。public class Pine 是启动类。public static void Main() 是运行时开始的地方。表达式 new Box(4) 建出一个 Box,并以 n 等于 4 调用 Box(int n)。体写出 size = n,于是该对象的 size 变为 4。然后 Main 写出 b.size,屏幕显示 4。不应再打印别的内容。
用 dotnet run 运行。程序写出一行后停止。它不等你键入。若 dotnet run 在等待,文件里仍有 ReadLine。删掉那一行,在 Pine 里保留 new Box(4) 加上写出,并把构造函数留在 Box 里。屏幕显示 4。若屏幕显示 3,残留的 c.fill = 3; 路径仍在运行。若屏幕显示 ok,旧的 Chip 演示可能还在文件里。屏幕行不对时,不要重装 .NET SDK。
若在唯一构造函数需要 int 时写无参数的 new Box(),生成会拒绝。让调用与构造函数的参数列表匹配。若在构造函数名前加 void,它会变成普通方法而不是构造函数,new Box(4) 也不会按本页期望的方式运行该体。标头必须像 Box(int n),不是 void Box(int n),也不是 static int Box(int n)。
与 new 之后赋值对比
在字段页,你在 new Cup() 之后写 c.fill = 3;。那仍然有效。本页把存储移进构造函数,使值在对象建出时就被设置。带 c.fill = 3; 的残留 Cup 演示是另一课。为本页请保留 Box 与 Pine 以及 new Box(4)。若 Pine 仍有 c.fill = 3; 而本文件没有 Cup 类,删掉那一行。生成不会替你发明 Cup。
只写 Console.WriteLine(b); 不会显示干净的 4。要看已存的数字,请写 Console.WriteLine(b.size);。对象引用本身不是字段值。你已在字段页学过该模式;在此检查构造函数的工作时继续沿用。
在其他程序里,你仍可在 new 之后给字段赋值。本课只是选择构造函数路径,让第一个有用的值在构建时到达。不要在本页的同一个 Pine 演示里混用两种风格。一条清楚的路径就够:参数给 new,在构造函数里存储,写出字段。
两个 box,两个 size
每次 new Box(...) 都会为另一个对象再次运行构造函数。你可以写 Box a = new Box(2); 和 Box b = new Box(9);,再写出两个 size 字段。第一次调用把 2 存到一个对象上。第二次调用把 9 存到另一个对象上。两个对象不共享同一个 size 槽位。
using System;
public class Pine
{
public static void Main()
{
Box a = new Box(2);
Box b = new Box(9);
Console.WriteLine(a.size);
Console.WriteLine(b.size);
}
}
public class Box
{
int size;
Box(int n)
{
size = n;
}
}
再次用 dotnet run 运行。屏幕应一行显示 2,下一行显示 9。每次构造函数调用都把自己的参数存到自己的对象上。写 Box b = a; 不会建出第二个对象——若要两个 size,就写两次 new Box(...) 调用。复制引用不等于调用构造函数两次。
若两行显示同一个数,请检查每个 new 是否传入不同参数,以及是否按该顺序写出 a.size 与 b.size。若生成停在第二个 new,查找缺失的括号或旧形状留下的错误类名。粘贴第一行却忘了改参数时,第二次调用里的小笔误很常见。
本页为 this 留下什么
本页用不同的名字写 size = n;。下一页——this——会展示名字冲突时如何谈论对象自己的字段。这里请留在清楚的参数名 n。本页若尚未熟悉,不要发明 this.size;本课目标是从 new 调用构造函数。单词 this 是下一主题,不是今天把 n 存进 size 的要求。
不要把 Box 嵌进 Pine 的花括号里。本页上两个类在文件里是并列的。若编译 Pine 时找不到 Box,检查 public class Box 是否在同一文件。若屏幕显示 0,构造函数可能缺少赋值,或 Main 仍使用从不设置 size 的无参形状——请保留 Box(int n) { size = n; } 和 new Box(4)。屏幕上的零通常表示字段停在默认值,因为存储从未运行。
你可以声明 int size;,写 Box(int n) { size = n; },并从 Pine.Main 用 Box b = new Box(4); 建出。用 dotnet run 运行。屏幕显示 4。构造函数在 new 建出对象时运行。你在构建时传入数字,构造函数存到字段上,写出证明了存储。把构造函数想成在 Main 越过 new 继续之前运行的准备工作。Pine 仍是你用 dotnet run 打开的门。下一页是 this,在那里你会学到在对象的方法和构造函数内部命名对象自身字段的另一种方式。
保持构造函数标头没有 void。保持 new 上的参数。保持对 b.size 的写出。这三项习惯是本页前进前的检查点。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部