正在加载...

Java 构造方法

在 Box.java 里写一个类 Box,带有名为 size 的 int 字段,以及会执行 size = n; 的构造方法 Box(int n)。在 Hall.java 里用 Box b = new Box(4); 构建一个盒子,然后打印 b.size。编译这两个文件并运行 java Hall。屏幕应显示一行:4。你传给 new 的数字会到达构造方法,构造方法在 main 继续之前把它存到对象上。在构建时——在构造方法内部——设置字段,就是本页要教的内容。

当 new 构建时运行的方法

构造方法与类同名。它没有 void 返回类型,也没有其他返回类型。当 main 写出 new Box(4) 时,Java 构建对象,并用 4 作为 n 运行该构造方法。构造方法结束后,变量持有准备好的对象。本页的全部任务就是:把一个值传给 new,让构造方法把它存进字段,再打印字段,以便你看到存储成功。
先创建 Box.java。public class 行是 public class Box。不要在这里留下旧的 Cup 或 Chip 类名。在花括号里声明 int size;。然后写构造方法:Box(int n) { size = n; }。本页请让参数名与 size 不同,这样赋值在不写 this 时也清楚。Box.java 里没有 main。编译前先保存。
单靠字段行不会把 4 放进对象。构造方法体在 new 调用它时做这件事。若你跳过构造方法只声明字段,后来的 new Box(4) 对不上,javac 会对这次调用报错。请在 Box.java 里保留两件东西:字段,以及写入该字段的构造方法。

Box with constructor

java
public class Box {
    int size;

    Box(int n) {
        size = n;
    }
}

Hall 把 4 传进 new Box

在同一文件夹创建 Hall.java。它的 public class 行是 public class Hall。在 main 里写 Box b = new Box(4);,然后 System.out.println(b.size);。参数 4 进入构造方法参数 n。本页不需要单独的 b.size = 4;——构造方法已经存好了值。打印行是为了让你能核实构造方法做了什么,而不必猜测。
把 Hall 保持为持有 main 的类。本课不要把 main 放进 Box。双文件形态与更早的对象页和字段页一致:一个文件定义类型,另一个文件构建并使用它。若你改了文件名却留下旧的 public class Shelf 行,javac 会拒绝,直到名字再次匹配。

Hall builds one box

java
public class Hall {
    public static void main(String[] args) {
        Box b = new Box(4);
        System.out.println(b.size);
    }
}

在放着这两个文件的文件夹里运行 javac Box.java Hall.java。两个文件都写好后,也可以先编译 Box.java,再编译 Hall.java。当圆括号、花括号和分号都配对时,javac 不会自己写出一行。然后运行 java Hall——不要 java Hall.java,也不要 java Box。运行命令不要带 .java 结尾。启动带有 main 的那个类。同样的命令在 Windows 和 macOS 上都可用。
程序应打印一行后停止:4。它不会让你输入。如果终端在等待键盘输入,说明某个文件里还留着旧练习的 nextLine 调用。删掉那个调用,在 Hall 里保留 new Box(4) 加打印,并在 Box 里保留构造方法。等待中的光标不是构造方法问题;那是放错位置的旧输入代码。
把运行走一遍。Java 从 Hall.main 开始。表达式 new Box(4) 构建一个 Box,并以等于 4 的 n 调用 Box(int n)。方法体写入 size = n,于是该对象的 size 变成 4。然后 main 打印 b.size,屏幕显示 4。不应再打印别的东西。如果你看到 ok、3 或 Cup 残留,说明你没有运行本页的 Hall 程序。
如果在唯一构造方法需要 int 时写出无参数的 new Box(),javac 会拒绝。让调用与构造方法的参数列表匹配。若在构造方法名前加上 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、Hall 和 new Box(4)。若 Hall 里仍有 c.fill = 3;,而本文件夹没有 Cup 类,请删掉那一行。编译器不会替你发明 Cup。
用 System.out.println(b); 只打印 b 本身,不会干净地显示 4。要看到已存的数字,请打印 b.size。对象引用本身不是字段值。你在字段页已学过这个模式;检查构造方法的工作时在这里也保持它。
在其他程序里,你仍可以在 new 之后给字段赋值。本课只是选择构造方法路径,让第一个有用的值在构建时到达。本页不要在同一个 Hall 演示里混用两种写法。一条清晰路径就够:给 new 传参数,在构造方法里存储,再打印字段。

两个盒子,两个 size

每一次 new Box(...) 都会为另一个对象再次运行构造方法。你可以写 Box a = new Box(2); 和 Box b = new Box(9);,然后打印两个 size 字段。第一次调用在一个对象上存 2。第二次调用在另一个对象上存 9。两个对象不共享同一个 size 槽位。

Hall builds two boxes

java
public class Hall {
    public static void main(String[] args) {
        Box a = new Box(2);
        Box b = new Box(9);
        System.out.println(a.size);
        System.out.println(b.size);
    }
}

再次编译并运行:javac Box.java Hall.java,然后 java Hall。屏幕应一行显示 2,下一行显示 9。每次构造方法调用都把自己的参数存到自己的对象上。写成 Box b = a; 不会构建第二个对象——若要两个 size,请使用两次 new Box(...)。复制引用与两次调用构造方法不是一回事。
若两行显示同一个数字,请检查每个 new 是否传入不同参数,以及是否按该顺序打印 a.size 和 b.size。若 javac 停在第二个 new,请查找缺少的括号,或旧文件留下的错误类名。粘贴第一行却忘记改参数时,第二次调用里的小笔误很常见。

留给 this 的内容

本页用不同的名字写 size = n;。后面的页面——this——会说明当名字冲突时如何谈对象自己的字段。这里请保持清晰的参数名 n。本页不要发明 this.size,除非你已经会用;本课目标是从 new 调用构造方法。词 this 是下一主题,不是今天把 n 存进 size 的必要条件。
若编译 Hall.java 时 javac 找不到 Box,请检查 Box.java 是否在同一文件夹,且类行是 public class Box。若屏幕显示 0,构造方法可能缺少赋值,或 main 仍在用从不设置 size 的无参形态——请保持 Box(int n) { size = n; } 和 new Box(4)。屏幕上的零通常表示字段停在默认值,因为存储从未运行。
若文件夹里仍有字段页留下的 Cup.java 或 Shelf.java,可以不动它们,或仅在它们干扰编译命令时删除。不要编译仍在赋值 c.fill 的旧 Shelf,却期望看到本页的屏幕。编译完本课的 Box 与 Hall 这一对之后,再运行 java Hall。

在 this 之前

你可以声明 int size;,写 Box(int n) { size = n; },并从 Hall 用 Box b = new Box(4); 构建。编译两个文件并运行 java Hall。屏幕显示 4。构造方法在 new 构建对象时运行。你在构建时传入数字,构造方法把它存到字段,打印证明了存储。下一页是 this,你将学习在方法和构造方法内部命名对象自身字段的另一种方式。
保持构造方法头部没有 void。保持 new 上的参数。保持打印 b.size。这三条习惯是本页继续前进前的检查点。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
5
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部