Java 中的 static
在 Tag.java 里写一个类 Tag,带有打印 ok 的 static 方法 static void ping()。在 Yard.java 的 main 里调用 Tag.ping();,本页不要写 new Tag()。编译这两个文件并运行 java Yard。屏幕应显示一行:ok。方法属于类名 Tag,不属于某个对象变量。通过类名调用,就是本页要教的内容。
写在类名上的方法
在实例方法那一页,你在 new Jar(3) 之后写 j.bump()。那次调用需要对象。static 方法不需要。你用类名写 Tag.ping();。本页上,Java 不必先构建 Tag 对象就能运行该方法。
先创建 Tag.java。public class 行是 public class Tag。不要在这里留下旧的 Jar 或 Tin 类名。在花括号里写一个方法:
static void ping() { System.out.println("ok"); }
第一段演示没有字段,也没有构造方法。Tag.java 里没有 main。编译前先保存。单词 static 写在方法头部、void 之前。没有 static 时,之后从 Yard 发出的 Tag.ping(); 调用会对不上本页想要的实例方法形态。
public class Tag {
static void ping() {
System.out.println("ok");
}
}
Yard 调用 Tag.ping
在同一文件夹创建 Yard.java。它的 public class 行是 public class Yard。在 main 里写一次调用:Tag.ping();。本页不要写 Tag t = new Tag();。也不要把 t.ping(); 当作本课路径。点号前面的类名就够了。
把 Yard 保持为持有 main 的类。本课不要把 main 放进 Tag。若实例方法页留下的 Desk 文件仍在文件夹里,本课不要运行 java Desk——编译 Tag.java 和 Yard.java 之后运行 java Yard。
public class Yard {
public static void main(String[] args) {
Tag.ping();
}
}
在放着这两个文件的文件夹里运行 javac Tag.java Yard.java。两个文件都写好后,也可以先编译 Tag.java,再编译 Yard.java。当圆括号、花括号和分号都配对时,javac 不会自己写出一行。然后运行 java Yard——不要 java Yard.java,也不要 java Tag。运行命令不要带 .java 结尾。启动带有 main 的那个类。同样的命令在 Windows 和 macOS 上都可用。
程序应打印一行后停止:ok。它不会让你输入。如果终端在等待键盘输入,说明某个文件里还留着旧练习的 nextLine 调用。删掉那个调用,在 Yard 里保留 Tag.ping();,并在 Tag 里保留 static void ping。
把运行走一遍。Java 从 Yard.main 开始。调用 Tag.ping() 找到类 Tag 上的 static 方法并运行其方法体。方法体打印 ok。没有构建对象。屏幕显示 ok。不应再打印别的东西。若看到 4 或 5,说明你仍在运行 bump 课留下的旧 Desk 程序。
若在 Yard.main 里写成前面没有 Tag. 的 ping();,这种形态下 javac 会拒绝。static 方法仍然需要它的类名(或你尚未使用的谨慎 import 写法)。请保留 Tag.ping();。若只写 void 而不写 static,那么对实例方法来说 Tag.ping(); 是错误的调用方式——把 static 加回去。头部必须像 static void ping(),不能只是 void ping(),本打印演示也不要用 static int ping()。
Tag.ping 与 j.bump 对照
一张短表把两种调用形态说清楚。
📊 static vs instance call
| 调用 | 是否先需要对象? |
|---|---|
Tag.ping(); |
否 — 类名就够 |
j.bump(); |
是 — 在 Jar j = new Jar(3); 之后 |
static void ping() |
类上的方法 |
void bump() |
每个对象上的方法 |
表格只是提醒。本页要保留的键入行是 Yard 里的 Tag.ping();,以及 Tag 里的 static void ping()。 |
与实例方法对比
在实例方法那一页,j.bump() 会改动一个 jar 的 fill。那种写法仍然有效。本页不改字段。它只从 static 方法打印 ok,好让你看到类名调用。残留的 Jar j = new Jar(3); j.bump(); 演示是另一课。本页请保留 Tag、Yard 和 Tag.ping();。
其他日子你仍可构建对象。本课有意选择 static 路径。本页不要在同一段 Yard 演示里混用 j.bump() 和 Tag.ping()。一条清楚路径就够:方法上有 static,调用前写类名,打印 ok。以后若同一程序需要两种风格,让每次调用都诚实——实例方法前写对象,static 方法前写类名——这样读者能看出你想要哪一种。
这次调用不需要 new Tag
因为 ping 是 static,Yard 在调用前不会分配 Tag 对象。写成 Tag t = new Tag(); 再写 t.ping();,在许多配置下对 static 方法也能编译,但那不是本页要教的形态。请只保留 Tag.ping();。若屏幕显示 4 或 5,说明旧的 Desk bump 演示仍在运行——改用 java Yard。
若 javac 说在 Tag 上找不到符号 ping,请检查方法头部是否包含 static,以及两个文件是否在同一文件夹。若 java Tag 运行了却没有有用结果,说明你启动了错误的类——请启动持有 main 的 Yard。
留给 access 的内容
本页在同一文件夹使用一个 public 类和一个包可见的 static 方法。后面一页——access——会在成员上展示 public 和 private 这类词。这里先留在 static 调用上。本页不要发明 private static,除非你已经会;本课目标是带 static void ping() 的 Tag.ping();。
若文件夹里仍有 Jar.java 或 Desk.java,可以不动它们,或仅在它们干扰编译命令时删除。编译本课的 Tag 与 Yard 这对文件之后,运行 java Yard。
进入 access 之前
你可以在 Tag 里写 static void ping() { System.out.println("ok"); },并从 Yard 在没有对象的情况下调用 Tag.ping();。编译这两个文件并运行 java Yard。屏幕显示 ok。static 方法在类名上运行了。下一页是 access,你会控制其他类可以看见哪些名字。
方法上保留 static。调用前保留类名。把 main 留在 Yard。这三项习惯是本页继续前进前的检查点。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部