The this Keyword
แนะนำใหม่พารามิเตอร์สามารถบดบังฟิลด์ที่ต้องการอัปเดต
- วัตถุมีชื่อ "Ada". setName(String name) ทำงาน name = name; พร้อมอาร์กิวเมนต์ "Bo"
- ทั้งสองชื่อที่ไม่ระบุชื่อหมายถึงพารามิเตอร์ ดังนั้นวัตถุยังมี "Ada". this.name = name กำหนดค่าพารามิเตอร์ลงบนฟิลด์แทน
"วัตถุนี้"
- ภายในเมทอดอินสแตนซ์,
thisหมายถึง วัตถุที่ถูกเรียกเมทอดนั้นstudent.addScore(10)ทำงานด้วยthis=studentนั้น this.scoreหมายความว่า "scoreของวัตถุที่ฉันกำลังทำงาน" มันช่วยให้เมทอดกล่าวถึงวัตถุของตัวเองได้อย่างชัดเจน
แยกแยะฟิลด์กับพารามิเตอร์
- การใช้งานหลัก: แยกตัวแปรinstance ออกจาก พารามิเตอร์ที่มีชื่อเดียวกัน
void setName(String name) { this.name = name; } this.nameคือ ตัวแปรinstance;nameแบบธรรมดาคือ พารามิเตอร์ นี่คือวิธีแก้ไขมาตรฐานสำหรับบักจาก shadowing ใน 3.8
การเข้าถึงวัตถุผู้รับด้วย
thisให้เมท hod มีอ้างอิงไปยังวัตถุที่เรียกใช้เมท hod นั้นอย่างแม่นยำ ทุก instance method จะมีthisโดยนัยไม่ว่าจะเขียนหรือไม่- เมื่อ score ชี้ถึง field ของ instance ที่ไม่ถูก shadow,
score += s;จะใช้this.scoreหากมี parameter หรือ local ตัวแปรที่มีชื่อ score ซึ่งไป shadow field นั้น ชื่อที่ไม่มีการ qualify จะชี้ไปที่ตัวแปรนั้น คุณต้องเขียนthisโดยตรงก็ต่อเมื่อจำเป็น (เช่นในการแก้ shadowing)
this ชี้ถึงวัตถุผู้รับ (receiver object)
ภายใน setName, this คือวัตถุ ada ที่ถูกเรียกใช้
Inside an instance method, this refers to...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
this คือตัวชี้ไปยังวัตถุปัจจุบัน
ใน setName(String name) { this.name = name; }, this.name คือ...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
this.name คือฟิลด์; name แบบธรรมดาคือพารามิเตอร์
คีย์เวิร์ด this สามารถใช้ภายในวิธี static ได้
Difficulty 1/5 · 100 coins + a small bonus on first completion today
วิธี static ไม่มีวัตถุเฉพาะเจาะจง ดังนั้นจึงไม่มี this
การเขียน name = name; (ไม่ใช้ this) ภายใน setName(String name) จะเกิดอะไรขึ้น?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ทั้งสองชื่อคือพารามิเตอร์; ใช้ this.name เพื่อเข้าถึงฟิลด์
ทุกวิธี instance มี this โดยนัย แม้จะไม่มีการเขียน它也 explicitly
Difficulty 1/5 · 100 coins + a small bonus on first completion today
วิธี instance มีผู้รับปัจจุบัน หากไม่มีการกำหนดชื่อ score โดยตรง จะหมายถึง this.score ก็ต่อเมื่อไม่มีพารามิเตอร์หรือตัวแปรท้องถิ่นที่遮蔽ฟิลด์นี้
ไม่มี this ในメธอดแบบ static
- static method ไม่มี
this— มันไม่ได้ผูกกับวัตถุใดวัตถุหนึ่ง ดังนั้น static method จึงไม่สามารถใช้thisหรือ field ของ instance ที่ไม่มีการ qualify ได้ แต่สามารถอ่าน field ของ instance ผ่านการอ้างอิงโดยตรงได้หากสิทธิ์การเข้าถึงอนุญาตให้ - พยายามใช้
thisใน static method จะเป็นข้อผิดพลาดในการคอมไพล์ หากคุณต้องการใช้thisเมท hod นั้นต้องเป็น instance method ไม่ใช่ static
ใช้ this.field = param; เพื่อแก้การบังชื่อ — this.name คือตัวแปร instance, name ธรรมดาๆ คือพารามิเตอร์. การเขียน name = name; (ไม่มี this) เพียงแค่ตั้งค่าพารามิเตอร์ให้ตัวเอง. และ this ไม่มีอยู่ในメธอดแบบ static — เมธอดแบบ static ไม่มีวัตถุเฉพาะ, ดังนั้นการใช้ this ที่นั่นจะไม่ compile.
Type the field value after the faulty setName("Bo") call on the described object.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
The parameter assigns to itself; the field is unchanged until this.name is used on the left.
หาก alias และ a ชี้ไปยัง Student คนเดียวกัน การเรียก alias.setName("Di") จะเปลี่ยนชื่อที่จะอ่านผ่าน a ในภายหลัง
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ทั้งสองการอ้างอิงระบุถึงวัตถุผู้รับเดียวกัน whose field ถูกอัปเดต
โค้ดในวัตถุ b เรียก a.setName("Cy"). ภายใน setName วัตถุใดคือ this?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ผู้รับ a ให้ค่า this ไม่ว่าโค้ดจากวัตถุอื่นใดจะเริ่มต้นการเรียกใช้ก็ตาม
การแก้ไขข้อผิดพลาดการบังชื่อด้วย this:
- ตัวแปร instance
private String name; void setName(String name) { this.name = name; }— ถูกต้อง!this.name(ฟิลด์) ได้รับค่าจากname(พารามิเตอร์).
ขยายเหตุผลไปยังกรณีใหม่
- ติดตาม a และ b เป็นนักเรียนที่สร้างแยกกันชื่อ Ada และ Bo การเปลี่ยน
a.setName("Cy")ทำให้ a เป็น Cy ในขณะที่ b ยังคงเป็น Bo หาก alias=a การเปลี่ยนalias.setName("Di")จะทำให้วัตถุแรกเดียวกันนี้เปลี่ยนไปด้วย ดังนั้น a จึงอ่านค่า Di - ผู้รับคือวัตถุที่ instance method ทำงานบนมัน ไม่จำเป็นต้องเป็นวัตถุ whose code ที่เรียกมัน Static method สามารถทำงานบนการอ้างอิงวัตถุแบบชัดเจนได้แต่ไม่มี this โดยนัย
this หมายถึง วัตถุปัจจุบัน — วัตถุที่メธอดแบบ instance ถูกเรียก. การใช้ที่สำคัญที่สุดคือการแก้ การบังชื่อ: this.name = name; ตั้งค่าพารามิเตอร์ให้กับตัวแปร instance. ทุกメธอดแบบ instance มี this โดยนัย, แต่ メธอดแบบ static ไม่มี, ดังนั้น this จึงไม่สามารถใช้ในที่นั้นได้.