正在加载...

Java 中的 this

在 Tin.java 里写一个类 Tin,带有名为 size 的 int 字段,以及会执行 this.size = size; 的构造方法 Tin(int size)。在 Lab.java 里用 Tin t = new Tin(7); 构建一个 tin,然后打印 t.size。编译这两个文件并运行 java Lab。屏幕应显示一行:7。参数和字段共用名字 size。词 this 命名对象上的字段,让存储到达正确位置。当名字冲突时使用 this,就是本页要教的内容。

为什么同名需要 this

在构造方法那一页,参数是 n,字段是 size,所以 size = n; 很清楚。这里两个名字都是 size。在构造方法内部,单独的 size 表示参数。写成 size = size; 会把参数复制到自身,字段留在默认值。对象上的字段仍然需要写入。那次写入在左侧使用 this.size。
先创建 Tin.java。public class 行是 public class Tin。不要在这里留下旧的 Box 或 Cup 类名。在花括号里声明 int size;。然后写构造方法:Tin(int size) { this.size = size; }。Tin.java 里没有 main。编译前先保存。
再读一遍赋值。右侧的 size 是到达参数的值——这里是 7。左侧的 this.size 是正在构建的对象上的字段。该行运行后,那个对象的 size 持有 7。若去掉 this. 并留下 size = size;,屏幕稍后会显示 0,因为字段从未改变。

Tin with this in constructor

java
public class Tin {
    int size;

    Tin(int size) {
        this.size = size;
    }
}

Lab 构建一个 tin

在同一文件夹创建 Lab.java。它的 public class 行是 public class Lab。在 main 里写 Tin t = new Tin(7);,然后 System.out.println(t.size);。参数 7 成为构造方法参数 size。构造方法用 this.size = size; 存下它。本页不需要单独的 t.size = 7;。
把 Lab 保持为持有 main 的类。本课不要把 main 放进 Tin。若构造方法页留下的 Hall 文件仍在文件夹里,本课不要运行 java Hall——编译 Tin.java 和 Lab.java 之后运行 java Lab。

Lab builds one tin

java
public class Lab {
    public static void main(String[] args) {
        Tin t = new Tin(7);
        System.out.println(t.size);
    }
}

在放着这两个文件的文件夹里运行 javac Tin.java Lab.java。两个文件都写好后,也可以先编译 Tin.java,再编译 Lab.java。当圆括号、花括号和分号都配对时,javac 不会自己写出一行。然后运行 java Lab——不要 java Lab.java,也不要 java Tin。运行命令不要带 .java 结尾。启动带有 main 的那个类。同样的命令在 Windows 和 macOS 上都可用。
程序应打印一行后停止:7。它不会让你输入。如果终端在等待键盘输入,说明某个文件里还留着旧练习的 nextLine 调用。删掉那个调用,在 Lab 里保留 new Tin(7) 加打印,并在 Tin 里保留 this.size = size;。
把运行走一遍。Java 从 Lab.main 开始。表达式 new Tin(7) 构建一个 Tin,并以等于 7 的参数调用 Tin(int size)。方法体写入 this.size = size,于是对象的字段变成 7。然后 main 打印 t.size,屏幕显示 7。
若写成 size = size; 而不是 this.size = size;,int 字段会停在 0。那时屏幕显示 0 而不是 7。这通常表示缺少 this。把 this. 放回赋值左侧。

this.size 与 size 对照

一张短表在你位于构造方法内部时把两个名字分清。

📊 this.size vs size

名称 在 Tin(int size) 中的含义
单独的 size 进入构造方法的参数
this.size 正在构建的对象上的字段
this.size = size; 把参数存进字段
size = size; 不会更新字段
表格只是提醒。你要保留的那一行是构造方法里的 this.size = size;,然后是 Lab 里的 Tin t = new Tin(7); 和 System.out.println(t.size);。

与构造方法页对比

在构造方法那一页,Box(int n) { size = n; } 能工作,因为 n 和 size 是不同的词。那种写法仍然有效。本页故意两次使用同一个词,让你需要 this。带有 size = n; 的残留 Box 和 Hall 演示是另一课。本页请保留 Tin、Lab 和 this.size = size;。
用 System.out.println(t); 只打印 t 本身,不会干净地显示 7。要看到已存的数字,请打印 t.size。对象引用本身不是字段值。
在其他日子里,你仍可以选择不同的参数名。本课故意选择匹配的名字。本页不要在同一个 Tin 演示里混用 n 和 this。一条清晰路径就够:名字匹配、字段上用 this、打印字段。

两个 tin 仍然彼此独立

每一次 new Tin(...) 都会为另一个对象再次运行构造方法。你可以写 Tin a = new Tin(2); 和 Tin b = new Tin(9);,然后打印两个 size 字段。每次调用都在自己的对象上使用 this.size = size;。两个对象不共享同一个 size 槽位。这项检查不需要第二个代码框——在已经看到 7 之后改一次 Lab 里的数字,或把单 tin 演示保留为你保存的文件。
若两行都显示 0,构造方法左侧仍然缺少 this。若编译 Lab.java 时 javac 找不到 Tin,请检查 Tin.java 是否在同一文件夹,且类行是 public class Tin。

留给实例方法的内容

本页只在构造方法内部用 this 来存储字段。后面的页面——实例方法——会展示在对象上运行、并能读取或更改字段的方法。这里请停留在构造方法里的存储。本课不要给 Tin 发明额外方法,除非你已经会;本课目标是名字匹配时的 this.size = size。
若 Lab 里仍有构造方法演示留下的 Box b = new Box(4);,而本文件夹没有你打算保留的 Box 类,请删掉那一行。保留 Tin t = new Tin(7); 和 System.out.println(t.size);。教 Tin 时编译器不会替你发明 Box。
当文件夹里仍有 Box.java 或 Hall.java 时,要么别动,要么仅在它们干扰编译命令时删除。编译本课的 Tin 与 Lab 这一对之后,运行 java Lab。

进入实例方法之前

你可以声明 int size;,写出 Tin(int size) { this.size = size; },并从 Lab 用 Tin t = new Tin(7); 构建。编译这两个文件并运行 java Lab。屏幕显示 7。当参数使用相同名字时,词 this 命名对象的字段。你在构建时传入数字,构造方法用 this 存下它,打印证明了存储。下一页是实例方法,对象已经存在之后,对象上的方法再使用字段。
构造方法头部不要加 void。字段上保留 this.。打印保持在 t.size。这三条习惯是本页继续前进前的检查点。

🧠 测试您的知识

准备开始

测试您的知识

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

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

📝 说明

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