ใน CodeGym นักเรียนจะได้รู้จักกับ Java คำสำคัญ นี้อย่างแท้จริงตั้งแต่บทเรียนแรก เมื่อเวลาผ่านไปความหมายของมันก็ชัดเจน แต่เมื่อมองย้อนกลับไป หลายๆ คนคงยอมรับกับตัวเองว่าไม่เข้าใจ Zen ของคีย์เวิร์ดนี้มานาน บทความนี้จะดึงม่านปิดความลับของ คีย์เวิร์ด นี้สำหรับใครก็ตามที่ยังไม่สามารถทำได้... ฉันมีการอ้างอิง Java ของ Schildtแล้ว ในหน้า 171 คุณจะเห็นว่าคีย์เวิร์ดนี้จำเป็นสำหรับวิธีการอ้างอิงวัตถุที่เรียกมัน เราสามารถจบบทเรียนด้วยสิ่งนั้น แต่เราต้องการข้อมูลเฉพาะ ตามกฎแล้ว คุณต้องใช้สิ่งนี้ ในสองกรณี:
ดังนั้น กลายเป็นว่าคุณแค่กำหนดตัวแปรชื่อ เมธอด ให้กับตัวมันเอง ซึ่งแน่นอนว่าไม่สมเหตุสมผลเลย ดังนั้น ภาษาจึงต้องการวิธีแยกแยะ ตัวแปร ชื่อคลาสHumanจาก ตัวแปร ชื่อในเมธอดsetName ปัญหานี้ได้รับการแก้ไขโดยการแนะนำ คีย์เวิร์ด นี้ซึ่งในกรณีนี้บ่งชี้ว่าคุณตั้งใจที่จะอ้างอิงตัวแปรที่เกี่ยวข้องกับอินสแตนซ์ของคลาสHumanไม่ใช่ตัวแปรในเมธอด: กล่าวอีกนัยหนึ่งนี่
หมายถึงวัตถุที่เรียกตามที่เรากล่าวถึงในตอนต้นของบทความ เป็นผลให้ เมธอด setNameตั้งชื่อบุคคลบนวัตถุที่สร้างขึ้น ด้านล่างนี้คือโค้ดของโปรแกรมโดยไม่ต้องใช้คีย์เวิร์ดนี้ รหัสสร้าง วัตถุ มนุษย์และกำหนดชื่อให้กับมัน:
และนี่คือรหัสที่มี คำหลัก นี้ :
- เมื่อตัวแปรอินสแตนซ์และตัวแปรเมธอด/คอนสตรัคเตอร์มีชื่อเดียวกัน
- เมื่อคุณต้องการเรียกใช้คอนสตรัคเตอร์ประเภทใดประเภทหนึ่ง (เช่น คอนสตรัคเตอร์เริ่มต้นหรือคอนสตรัคเตอร์ที่กำหนดพารามิเตอร์) จากคอนสตรัคเตอร์ประเภทอื่น สิ่งนี้เรียกว่าการเรียกตัวสร้างที่ชัดเจน
ตัวอย่างที่ 1: ตัวแปรอินสแตนซ์และตัวแปรเมธอดมีชื่อเดียวกัน
สมมติว่าเรามี คลาส Humanที่กำหนดฟิลด์ชื่อ: ลองสร้าง setter สำหรับ ตัวแปร ชื่อ (setter ทำงานได้อย่างสมบูรณ์ — ไม่มี catch ที่นี่):
class Human {
String name;
public void setName(String newName) {
name = newName;
}
}
โปรดทราบว่าเราส่งString newNameไปยัง เมธอด setName setter เราประกาศตัวแปรใหม่และสามารถตั้งชื่อตัวแปรตามที่เราต้องการได้ เพราะจะมองเห็นได้เฉพาะในวงเล็บปีกกา ({}) ที่ล้อมรอบเมธอดsetName โปรดทราบว่าตัวตั้งค่ามีบรรทัดเดียว:
name = newName;
ที่นี่ เราได้แนะนำตัวแปรใหม่ชื่อnewName และกำหนดให้กับ ตัวแปรชื่อที่มีอยู่ของวัตถุ โปรแกรมเมอร์หลายคนอาจรู้สึกแปลกที่จะแนะนำตัวแปรด้วยชื่อใหม่ ทั้งที่ท้ายที่สุดแล้วเรากำลังพูดถึงสิ่งเดียวกัน นั่นคือเรากำลังพูดถึงฟิลด์ชื่อในคลาสHuman นั่นเป็นเหตุผลที่ผู้สร้าง Java คิดวิธีที่จะใช้ชื่อตัวแปรเดียวกันได้อย่างสะดวก กล่าวอีกนัยหนึ่ง เหตุใดจึงมีสองชื่อสำหรับตัวแปรที่แสดงถึงสิ่งเดียวกัน กล่าวอีกนัยหนึ่งเราต้องการทำสิ่งนี้:
class Human {
String name;
public void setName(String name) {
name = name;
}
}
แต่ที่นี่เราพบปัญหา ตอนนี้เรามีตัวแปรสองตัวที่มีชื่อเดียวกัน ชื่อสตริงหนึ่ง ชื่อ เป็นของ คลาส Human ในขณะที่ ชื่อสตริงอื่นเป็นของเมธอดsetName เป็นผลให้ JVM ไม่ทราบว่าตัวแปรใดที่คุณอ้างถึงเมื่อคุณเขียนบรรทัดต่อไปนี้ใน setter:
name = name;
Java ถือว่าคุณหมายถึง ตัวแปร ชื่อ ที่ใกล้เคียงที่สุด เช่น ตัวแปรจากเมธอด setName


public class Solution {
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Vinny");
human1.print();
}
}
class Human {
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print() {
System.out.println(name);
}
}
ดังนั้นสิ่งนี้ช่วยให้เราหลีกเลี่ยงการแนะนำตัวแปรใหม่เพื่อแสดงถึงสิ่งเดียวกัน ทำให้โค้ดสะอาดขึ้นและยุ่งเหยิงน้อยลงด้วยตัวแปรพิเศษ
ตัวอย่างที่ 2: ใช้สิ่งนี้สำหรับการเรียกตัวสร้างที่ชัดเจน
การเรียกคอนสตรัคเตอร์หนึ่งตัวจากอีกอันหนึ่งจะมีประโยชน์เมื่อคุณมีคอนสตรัคเตอร์หลายตัว (แปลกพอสมควร) และคุณไม่ต้องการให้คอนสตรัคเตอร์ใหม่ทำซ้ำโค้ดเริ่มต้นที่เขียนไว้ก่อนหน้านี้ในคอนสตรัคเตอร์อื่น สับสน? มันไม่น่ากลัวอย่างที่คิด ดูรหัสด้านล่าง มีตัวสร้างสองตัวสำหรับ คลาส Human :
class Human {
int age;
int weight;
int height;
Human(int age, int weight) {
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height) {
// Call the constructor with two parameters
this(age, weight);
// and then initialize the missing variable
this.height = height;
}
}
ขั้นแรกเราได้จัดเตรียมคอนสตรัคเตอร์ด้วยพารามิเตอร์สองตัว: int ageและint weight สมมติว่ามีรหัสสองบรรทัด:
this.age = age;
this.weight = weight;
ต่อมาเราตัดสินใจเพิ่มตัวสร้างอีกตัวที่มีพารามิเตอร์สามตัว เพิ่มความสูงให้กับพารามิเตอร์อายุและน้ำหนักที่มีอยู่ คุณสามารถเขียนตัวสร้างใหม่ดังนี้:
this.age = age;
this.weight = weight;
this.height = height;
แต่แทนที่จะทำซ้ำโค้ดที่มีอยู่ในตัวสร้างนี้ คุณสามารถใช้ คีย์เวิร์ด นี้เพื่อเรียกตัวสร้างอย่างชัดเจนด้วยพารามิเตอร์สองตัว:
this(age, weight);
// and then initialize the missing variable:
this.height = height;
เหมือนกับว่าเรากำลังพูดกับตัวสร้างสามพารามิเตอร์:
- เรียกตัวสร้างอื่นที่มีสองพารามิเตอร์นี้
- แล้วเพิ่มตัวแปรอื่น
GO TO FULL VERSION