Java 中的对象
在 Chip.java 里写一个名为 Chip 的类,带有打印 ok 的方法 beep。本页该方法不是 static。在第二个文件 Bench.java 里用 Chip c = new Chip(); 构建一个 chip,再调用 c.beep();。编译这两个文件并运行 java Bench。屏幕应显示一行:ok。单词 new 从类构建一个对象。变量 c 持有该对象。你在 c 上调用 beep,而不是在光秃的类名上。这个构建出的对象——以及使用它的调用——就是本页要教的内容。
从类得到一个对象
类仍然是具名类型。对象是从该类型构建出的一个值。行 new Chip() 请 Java 构建这个值。你把它存进类型为 Chip 的变量,再用该变量去触达属于每个对象的方法。
先创建 Chip.java。public class 行是 public class Chip。不要在这个文件里留下旧的 Badge 或 Desk 类名。在花括号里写 void beep()——这个头上不要有 static 一词。方法体是一次打印:System.out.println("ok");。保持 void。方法不返回数字。本页的 Chip.java 里没有 main。编译前先保存文件。
public class Chip {
void beep() {
System.out.println("ok");
}
}
Bench 构建 chip,再调用 beep
在同一文件夹创建 Bench.java。它的 public class 行是 public class Bench。在 main 里写两行:先 Chip c = new Chip();,再 c.beep();。第一行声明类型为 Chip 的变量 c,并用新对象填满它。第二行在该对象上调用 beep。点写在变量名后面,而不是只写在类名后面。
public class Bench {
public static void main(String[] args) {
Chip c = new Chip();
c.beep();
}
}
在存放这两个文件的文件夹里运行 javac Chip.java Bench.java。文件齐全时也可以先编译 Chip.java 再编译 Bench.java。当圆括号、花括号和分号都匹配时,javac 自己不会写出一行。然后运行 java Bench——不要写成 java Bench.java,也不要写成 java Chip。运行命令去掉 .java 后缀。启动带有 main 的那个类。这些命令在 Windows 和 macOS 上都一样。
程序应打印一行后停止:ok。它不应等待你输入。如果终端在等键盘,说明某个文件里还留着旧练习的 nextLine 调用。删掉它,在 Bench 里保留 Chip c = new Chip(); 和 c.beep();,并在 Chip 里保留 beep。
把这次运行走一遍。Java 从 Bench.main 开始。表达式 new Chip() 构建一个对象。该对象存进 c。调用 c.beep() 进入该对象的 beep。方法打印 ok 并返回。然后 Bench 结束。屏幕行来自对象的方法,发生在 new 创建对象之后。
把类想成磁盘上的蓝图,把对象想成这次运行在内存里建成的一件。蓝图编译一次。每次 new Chip() 再建一件。变量给那件起名,好让后面的行够得着。没有那个名字,本页就没有可供 beep 抓住的把手。
为何调用用 c,而不是单独的 Chip
在类那一页,static 方法可以用类型名写成 Badge.show()。这里 beep 没有 static 一词。Java 先期望一个对象。没有对象就写 Chip.beep(); 不符合本页初学者形状。用 new 构建,把结果留在变量里,再通过该变量调用。
若只写 new Chip(); 却从不保存,你仍然构建了对象,但没有名字可用来调用 beep。本页请保留变量:Chip c = new Chip(); 然后 c.beep();。变量是 new 结束后通向对象的路。
残留的 static 演示会搅乱文件夹。仍调用 Badge.show(); 的文件是上一课的形状。本页请保留 Chip 和 Bench 以及 new 那一行。这里不需要 Badge。
两个对象,两次 beep
你可以从同一个类构建多个对象。每次 new Chip() 做出单独的对象。每个对象可以自己跑 beep。类文本是共享的;对象不是同一个值。
public class Bench {
public static void main(String[] args) {
Chip a = new Chip();
Chip b = new Chip();
a.beep();
b.beep();
}
}
再次编译并运行:javac Chip.java Bench.java,然后 java Bench。屏幕应显示两行:ok,然后 ok。第一行来自 a。第二行来自 b。两者都用了 Chip 里同一段 beep 方法文本,但每次调用跑在用 new 构建的不同对象上。
若屏幕只显示一个 ok,检查两次调用是否都在,以及两个变量是否都用 new 构建。写成 Chip b = a; 不会构建第二个对象;它让 b 指向与 a 相同的对象。那个想法留给后面的页。本页若要两个对象,请写两个 new Chip() 表达式。
本页留给 fields 的内容
本页还不在 chip 里存数字或单词。字段——在每个对象上保存数据的名字——是下一页。这里对象在 new 之后存在,实例方法 beep 只负责打印。这已足够看出类作为类型、对象作为构建值之间的拆分。
可以把变量从 c 改名为 unit:Chip unit = new Chip(); 然后 unit.beep();。当方法体仍打印那个词时,屏幕保持 ok。变量名是你的;类型名 Chip 与表达式 new Chip() 仍须一致。
若编译 Bench.java 时 javac 说找不到符号 Chip,检查同一文件夹里是否有 Chip.java,且类行确实是 public class Chip。若运行什么也不打印,确认 main 在 new 行之后仍调用 c.beep();,且 beep 里仍有 println。
进入 fields 之前
你可以写带 void beep() 的 Chip,用 Chip c = new Chip(); 构建对象,并从 Bench 调用 c.beep();。编译两个文件并运行 java Bench。屏幕显示 ok。第二次 new Chip() 再构建一个能自己 beep 的对象。下一页是 fields;在那里每个对象开始保存自己的数据。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部