static
写一个类 Cup,带静态字段 int tally 和静态方法 void Mark()(其中执行 tally = tally + 1;)。在 Pine 里保留 Main,调用 Cup.Mark(); 两次,再写出 Cup.tally。两种类型放在同一教学文件里,这样 dotnet run 仍然简单。用 dotnet run 运行。屏幕应显示一行:2。方法通过类名运行,而不是通过对象变量。在类上共享一个 tally,就是本页要教的内容。请把启动用的公共类名保持为 Pine。
属于类名的成员
在 instance-methods 页,你通过 jar 变量调用 j.bump()。这里字段和方法在 Cup 本身上。你用 Cup.Mark() 和 Cup.tally 访问它们。本页这次调用不需要 new Cup(...)。每次调用 Mark 都会给同一个 tally 加一。
打开 Pine 文件。启动类名仍是 Pine。本页不改启动名。如果 Main 里只剩 bump 演示,删掉残留的 Jar j = new Jar(3);。删掉任何 Jar 类残留。删掉任何 Tin 残留。删掉 ReadLine 行。你保留的文件里不应等待输入。
在 Pine 的花括号外——仍在同一文件里——写 public class Cup。在花括号内声明 static int tally;。再写静态方法:static void Mark() { tally = tally + 1; }。本页没有构造函数,也没有实例字段。运行前先保存文件。
方法头需要 static 和 void。static 标记成员属于类名。void 仍表示 Mark 不向写出返回值。请按你敲入的顺序保留这两个词。
using System;
public class Cup
{
static int tally;
static void Mark()
{
tally = tally + 1;
}
}
Pine 通过类名调用 Mark
Pine 保留 public static void Main()。在 Main 内按顺序写三行:Cup.Mark();,再一次 Cup.Mark();,然后 Console.WriteLine(Cup.tally);。每次调用加一。写出显示共享计数。本页不要写 Jar j = new Jar(3); 或 j.bump();。那是 instance-methods 课。
using System;
public class Pine
{
public static void Main()
{
Cup.Mark();
Cup.Mark();
Console.WriteLine(Cup.tally);
}
}
public class Cup
{
static int tally;
static void Mark()
{
tally = tally + 1;
}
}
从顶部读你保留的文件。using System; 准备短名。public class Pine 是启动类。public static void Main() 是运行时开始的地方——Main 本身已经是 static,所以程序可以先不建 Pine 对象就启动。Cup.Mark() 进入类上的 Mark。方法体写 tally = tally + 1。第一次调用把 tally 从 0 移到 1。第二次移到 2。然后 Main 写出 Cup.tally,屏幕显示 2。
用 dotnet run 运行。程序写一行就结束。不会等你输入。如果 dotnet run 在等待,文件里还有 ReadLine。删掉那行,在 Pine 里保留两次 Cup.Mark(); 和写出,在 Cup 里保留 Mark。屏幕显示 2。如果屏幕显示 4 或 5,可能还在跑残留的 Jar bump 演示。如果屏幕显示 0,可能缺少 Mark 调用,或调用在写出之后。
如果在这种 Main 形状里写没有 Cup. 前缀的 Mark();,除非加上本页不教的更多接线,否则编译会拒绝。请保留 Cup.Mark();。如果写 Cup c = new Cup(); 又只谈实例方法,你就离开了 static 课。本页目标是类名调用。
与 j.bump 和残留 Jar 对比
在 instance-methods 页,j.bump() 前面需要对象。当你只想改一个 jar 时这仍然有效。本页的 Cup.Mark() 前面需要类名。残留 Jar j = new Jar(3); j.bump(); Console.WriteLine(j.fill); 是另一课。本页请保留 Cup、Pine 和 Cup.Mark();。
你以后仍可发明实例方法。本课把共享计数放在类上,这样不用 new 的两次调用仍共享一个 tally。只写 Console.WriteLine(Cup); 不会干净地显示 2。要写 Console.WriteLine(Cup.tally); 才能看到存下的数字。
📊 j.bump vs Cup.Mark
| 调用形状 | 需要对象? | 改变什么 |
|---|---|---|
j.bump(); |
是 — jar 变量 | 那个 jar 的 fill |
Cup.Mark(); |
否 — 用类名 | 共享的 Cup.tally |
每次 Mark 调用共享的一个 tally
本页不必建两个 cup 才能得到两个标记。第一次 Cup.Mark(); 和第二次 Cup.Mark(); 都碰同一个静态字段。这就是 static int tally 的意义。如果以后加对象,除非你再设计别的结构,它们仍共享那一个 tally。对教学文件来说,两次类名调用就够。
如果屏幕仍显示 1,可能只有一次 Mark 调用,或写出夹在两次调用之间。请在 Console.WriteLine(Cup.tally); 之前保留两次调用。如果屏幕显示 7 或其他残留数字,文件里可能还有旧的 Tin 或 Jar 演示。请保留两次 Cup.Mark(); 和对 Cup.tally 的写出。
会遮住静态调用的错误
从 Mark 去掉 static 会变成实例方法。那时从 Main 的 Cup.Mark(); 会让编译失败,页面就不再教类名调用了。请把 static 放回字段和方法上。如果 Jar 文件还开着就只调用 j.bump();,也会遮住本课——练习 Cup 时请从 Main 删掉那个演示。
另一个陷阱是只在 Main 里写 Cup.tally = Cup.tally + 1; 却从不写 Mark。两次赋值后可能打印 2,但会跳过本页要你敲的静态方法形状。请优先两行 Cup.Mark();,让方法体拥有加一。如果 new Cup() 后 IntelliSense 提供实例调用,本练习请忽略,坚持用 Cup.Mark();。
留给 access 的内容
本页通过类名访问成员:Cup.Mark() 和 Cup.tally。后面的 access 页会展示 public、private 等词,控制谁能看到成员。本页先留在 static。除非你已经在用,不要在每一行都发明访问关键字;本课目标是类名调用和共享字段。
不要把 Cup 嵌进 Pine 的花括号里。本页两个类在文件里是并列的。如果编译 Pine 时找不到 Cup,请检查 public class Cup 是否在同一文件。如果屏幕显示 0,可能 Mark 从未运行——请在写出前保留两行 Cup.Mark();。如果编译抱怨 Mark 需要对象,请检查方法头是否仍包含 static。
你可以声明 static int tally;,写 static void Mark() { tally = tally + 1; },从 Pine.Main 运行 Cup.Mark(); 两次,再写出 Cup.tally。用 dotnet run 运行。屏幕显示 2。静态方法在类名上运行并改变了共享字段。把 Mark 想成类本身在不先建 cup 时也能做的动作。Pine 仍是你用 dotnet run 打开的门。下一页是 access,其中有些成员会故意对其他代码开放或关闭。
请在字段和方法上保留 static。请在调用前保留类名:Cup.Mark();。请把写出放在 Cup.tally 上。这三个习惯是本页继续前的检查点。请别把 j.bump() 演示留在 Main 里,免得屏幕误显示 jar 数字。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部