this
และ
super
เป็นคำหลักพิเศษสองคำใน Java ที่แสดงถึงอินสแตนซ์ปัจจุบันของคลาสและซูเปอร์คลาสตามลำดับ โปรแกรมเมอร์ Java มักจะสร้างความสับสนให้กับคำเหล่านี้ และไม่ค่อยตระหนักถึงคุณสมบัติพิเศษของคำเหล่านี้ ซึ่งมักถูกถามถึงในการสัมภาษณ์ Java Core ตัวอย่างเช่น คำถามสองสามข้อที่เข้ามาในความคิดทันทีเกี่ยวกับ
this
และ เป็น
super
ไปได้ไหมที่จะกำหนดความหมายที่แตกต่างให้กับคีย์เวิร์ด
this
ใน Java? และความแตกต่างระหว่างคำหลัก
this
และ
super
ใน Java คืออะไร ไม่ทราบ? ฉันไม่ได้ให้คำตอบที่นี่ - สามารถพบได้ในตอนท้ายของบทความ
อย่างที่ผมบอกไปตอนต้น ความแตกต่างหลักระหว่าง
this
และ
super
ใน Java ก็คือ
this
อินสแตนซ์ปัจจุบันของคลาสเป็นตัวแทน ในขณะที่อิน
super
สแตนซ์ปัจจุบันของคลาสพาเรนต์เป็นตัวแทน นี่คือตัวอย่างหนึ่งของการใช้ตัวแปร
this
และ
super
คุณคงเคยเห็นตัวอย่างการเรียก Constructor ของตัวแปรหนึ่งจากอีกตัวแปรหนึ่งที่เรียกว่า การเรียกคอนสตรั คเตอร์ในห่วงโซ่สามารถทำได้ผ่านการใช้คำหลัก
this
และ
super
ภายในคลาส เพื่อเรียกคอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์ จะถูกใช้
this()
ในขณะที่
super()
มันถูกใช้เพื่อเรียกคอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์ หรือที่เรียกกันว่าคอนสตรัคเตอร์เริ่มต้นของคลาสพาเรนต์ อย่างไรก็ตาม ด้วยวิธีนี้ คุณสามารถเรียกได้ไม่เพียงแต่คอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์เท่านั้น แต่ยังรวมถึงคอนสตรัคเตอร์อื่น ๆ ได้ด้วยการส่งพารามิเตอร์ที่เหมาะสมไปให้
this
เราจะเห็นตัวอย่าง การใช้งาน นี้ เร็วๆ
super
นี้ นอกจากนี้ ใน
this
Java
super
ยังใช้เพื่อเข้าถึงตัวแปรของอินสแตนซ์คลาสและพาเรนต์ ในความเป็นจริงสามารถเข้าถึงได้โดยไม่ต้องใส่คำนำหน้า
super
และ
this
แต่ถ้าในบล็อกปัจจุบันตัวแปรดังกล่าวไม่ทับซ้อนกับตัวแปรอื่น ๆ เช่น หากไม่มีตัวแปรท้องถิ่นที่มีชื่อเหมือนกัน มิฉะนั้น คุณจะต้องใช้ชื่อที่มีคำนำหน้า แต่นั่นไม่สำคัญ เพราะ ในรูปแบบนี้จะสามารถอ่านได้มากขึ้น ตัวอย่างคลาสสิกของแนวทางนี้คือการใช้
this
ภายในตัวสร้างที่รับพารามิเตอร์ที่มีชื่อเดียวกันกับตัวแปรอินสแตนซ์ ต่อไปในบทความเราจะค้นหาความแตกต่างอื่น ๆ ระหว่าง
super
และ
this
และดูตัวอย่างการใช้งาน
สิ่งนี้และซุปเปอร์คล้ายกันอย่างไร
ก่อนที่จะดูความแตกต่างระหว่างคำหลัก
this
และ
super
เรามาดูความคล้ายคลึงกันบางประการก่อน:
- ทั้งสอง
this
และsuper
เป็นตัวแปรที่ไม่คงที่ ดังนั้นจึงไม่สามารถใช้ในบริบทคงที่ได้ ซึ่งหมายความว่าไม่สามารถใช้ในวิธีการหลักได้ ซึ่งจะส่งผลให้เกิดข้อผิดพลาดเวลาคอมไพล์ " this
ไม่สามารถอ้างอิงตัวแปรที่ไม่คงที่จากบริบทคงที่" สิ่งเดียวกันนี้จะเกิดขึ้นหากคุณใช้คำหลักในวิธีการsuper
หลัก
- ทั้งสอง
this
และsuper
สามารถใช้ภายในคอนสตรัคเตอร์เพื่อเรียกคอนสตรัคเตอร์อื่นๆ ในห่วงโซ่ ตัวอย่างเช่นthis
() และsuper
() เรียกคอนสตรัคเตอร์โดยไม่มีอาร์กิวเมนต์ของคลาสที่สืบทอดและคลาสพาเรนต์ ตามลำดับ
ในตัวอย่างด้านล่าง ขั้นแรกเราส่งการเรียกจากตัวสร้างที่ไม่มีอาร์กิวเมนต์ของคลาส B ไปยังตัวสร้างของคลาส B เดียวกันที่รับพารามิเตอร์ชนิดเดียว
String
ซึ่งจะ
super("")
เรียกตัวสร้างอาร์กิวเมนต์เดียวจากซูเปอร์คลาส
class A{
A(){
System.out.println("Конструктор без аргументов класса A");
}
A(String args){
System.out.println("Конструктор с одним аргументом класса A");
}
}
class B extends A{
B(){
this("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
เอาท์พุต: ตัวสร้างอาร์กิวเมนต์หนึ่งตัวของคลาส A ตัวสร้างอาร์กิวเมนต์หนึ่งของคลาส B ตัวสร้างอาร์กิวเมนต์หนึ่งของคลาส B
- ภายใน Constructor
this
และsuper
จะต้องปรากฏเหนือนิพจน์อื่นๆ ทั้งหมดตั้งแต่เริ่มต้น มิฉะนั้นคอมไพลเลอร์จะส่งข้อความแสดงข้อผิดพลาด จากที่ตามมานั้นตัวสร้างตัวเดียวไม่สามารถมีทั้งสองอย่างthis()
และsuper()
ความแตกต่างระหว่างซุปเปอร์กับสิ่งนี้
ตอนนี้เรารู้วิธีใช้คำหลัก
super
และ
this
เข้าใจแล้วว่าคำหลักเหล่านั้นจำเป็นเพื่ออะไร แต่มีตัวเลือกอื่นสำหรับการใช้คำหลักเหล่านี้ที่ฉันไม่ได้พูดถึง - ในคลาส Inner ซึ่งสะดวกมากในการอ้างถึงคลาสภายนอกโดยใช้แบบฟอร์มสัญกรณ์ภายนอก
this
สำหรับอินสแตนซ์ปัจจุบันและภายนอก
super
- สำหรับพ่อแม่ของเขา อย่าลืมแทนที่ Outer ด้วยชื่อของคลาสภายนอก ตอนนี้เรามาสรุปความแตกต่างที่สำคัญระหว่างคำหลัก
this
และ
super
- ตัวแปร
this
อ้างอิงถึงอินสแตนซ์ปัจจุบันของคลาสที่ใช้งาน ในขณะที่มันsuper
อ้างถึงอินสแตนซ์ปัจจุบันของคลาสพาเรนต์
- คอนสตรัคเตอร์แต่ละตัว ในกรณีที่ไม่มีการเรียกคอนสตรัคเตอร์อื่นอย่างชัดเจน จะเรียกคอน
super()
สตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์ของคลาสพาเรนต์โดยปริยาย แต่คุณมักจะมีตัวเลือกในการเรียกคอนสตรัคเตอร์อื่นอย่างชัดเจนด้วยthis()
หรือsuper()
นี่อาจเป็นทั้งหมดที่สามารถพูดได้เกี่ยวกับความแตกต่างระหว่างคำหลัก
this
และ
super
ใน Java และวิธีการใช้ในโปรแกรม ดังที่เราได้เห็นไปแล้ว วัตถุประสงค์หลักของพวกเขาคือการเรียก Constructor ตัวหนึ่งจากอีกตัวหนึ่งและอ้างอิงถึงตัวแปรอินสแตนซ์ที่ประกาศในคลาสปัจจุบันและคลาสพาเรนต์ อย่าลืมว่าสิ่งเหล่านี้ไม่ใช่ตัวแปรธรรมดา และตอนนี้ - คำตอบสำหรับคำถามของฉันซึ่งฉันถามในย่อหน้าแรก ไม่ได้
this
ไม่สามารถกำหนดค่าตัวแปรใหม่ได้ เนื่องจากตัวแปรถูกประกาศเป็นค่าสุดท้าย คุณสามารถลองทำสิ่งนี้ได้ใน IDE - คุณจะได้รับข้อผิดพลาดในการคอมไพล์ "คุณไม่สามารถกำหนดค่าใหม่ให้กับตัวแปรได้
this
- มันถูกประกาศให้เป็นที่สิ้นสุด"
บทความต้นฉบับที่นี่
GO TO FULL VERSION