JavaRush /จาวาบล็อก /Random-TH /ความแตกต่างระหว่างคีย์เวิร์ดนี้กับคีย์เวิร์ดขั้นสูงใน Jav...
grishin
ระดับ
Харьков

ความแตกต่างระหว่างคีย์เวิร์ดนี้กับคีย์เวิร์ดขั้นสูงใน Java

เผยแพร่ในกลุ่ม
thisและsuperเป็นคำหลักพิเศษสองคำใน Java ที่แสดงถึงอินสแตนซ์ปัจจุบันของคลาสและซูเปอร์คลาสตามลำดับ โปรแกรมเมอร์ Java มักจะสร้างความสับสนให้กับคำเหล่านี้ และไม่ค่อยตระหนักถึงคุณสมบัติพิเศษของคำเหล่านี้ ซึ่งมักถูกถามถึงในการสัมภาษณ์ Java Core ตัวอย่างเช่น คำถามสองสามข้อที่เข้ามาในความคิดทันทีเกี่ยวกับthisและ เป็น superไปได้ไหมที่จะกำหนดความหมายที่แตกต่างให้กับคีย์เวิร์ดthisใน Java? และความแตกต่างระหว่างคำหลักthisและsuperใน Java คืออะไร ไม่ทราบ? ฉันไม่ได้ให้คำตอบที่นี่ - สามารถพบได้ในตอนท้ายของบทความ ความแตกต่างระหว่างคีย์เวิร์ดนี้กับคีย์เวิร์ดขั้นสูงใน Java - 1อย่างที่ผมบอกไปตอนต้น ความแตกต่างหลักระหว่างthisและsuperใน Java ก็คือthisอินสแตนซ์ปัจจุบันของคลาสเป็นตัวแทน ในขณะที่อินsuperสแตนซ์ปัจจุบันของคลาสพาเรนต์เป็นตัวแทน นี่คือตัวอย่างหนึ่งของการใช้ตัวแปรthisและsuperคุณคงเคยเห็นตัวอย่างการเรียก Constructor ของตัวแปรหนึ่งจากอีกตัวแปรหนึ่งที่เรียกว่า การเรียกคอนสตรั คเตอร์ในห่วงโซ่สามารถทำได้ผ่านการใช้คำหลักthisและ superภายในคลาส เพื่อเรียกคอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์ จะถูกใช้this()ในขณะที่super()มันถูกใช้เพื่อเรียกคอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์ หรือที่เรียกกันว่าคอนสตรัคเตอร์เริ่มต้นของคลาสพาเรนต์ อย่างไรก็ตาม ด้วยวิธีนี้ คุณสามารถเรียกได้ไม่เพียงแต่คอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์เท่านั้น แต่ยังรวมถึงคอนสตรัคเตอร์อื่น ๆ ได้ด้วยการส่งพารามิเตอร์ที่เหมาะสมไปให้ thisเราจะเห็นตัวอย่าง การใช้งาน นี้ เร็วๆsuperนี้ นอกจากนี้ ใน thisJava superยังใช้เพื่อเข้าถึงตัวแปรของอินสแตนซ์คลาสและพาเรนต์ ในความเป็นจริงสามารถเข้าถึงได้โดยไม่ต้องใส่คำนำหน้าsuperและthisแต่ถ้าในบล็อกปัจจุบันตัวแปรดังกล่าวไม่ทับซ้อนกับตัวแปรอื่น ๆ เช่น หากไม่มีตัวแปรท้องถิ่นที่มีชื่อเหมือนกัน มิฉะนั้น คุณจะต้องใช้ชื่อที่มีคำนำหน้า แต่นั่นไม่สำคัญ เพราะ ในรูปแบบนี้จะสามารถอ่านได้มากขึ้น ตัวอย่างคลาสสิกของแนวทางนี้คือการใช้thisภายในตัวสร้างที่รับพารามิเตอร์ที่มีชื่อเดียวกันกับตัวแปรอินสแตนซ์ ต่อไปในบทความเราจะค้นหาความแตกต่างอื่น ๆ ระหว่างsuperและthisและดูตัวอย่างการใช้งาน

สิ่งนี้และซุปเปอร์คล้ายกันอย่างไร

ก่อนที่จะดูความแตกต่างระหว่างคำหลักthisและsuperเรามาดูความคล้ายคลึงกันบางประการก่อน:
  1. ทั้งสองthisและsuperเป็นตัวแปรที่ไม่คงที่ ดังนั้นจึงไม่สามารถใช้ในบริบทคงที่ได้ ซึ่งหมายความว่าไม่สามารถใช้ในวิธีการหลักได้ ซึ่งจะส่งผลให้เกิดข้อผิดพลาดเวลาคอมไพล์ " thisไม่สามารถอ้างอิงตัวแปรที่ไม่คงที่จากบริบทคงที่" สิ่งเดียวกันนี้จะเกิดขึ้นหากคุณใช้คำหลักในวิธีการsuperหลัก

  2. ทั้งสอง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(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

    public static void main(String args[]) {
       B b = new B();
    }

}
เอาท์พุต: ตัวสร้างอาร์กิวเมนต์หนึ่งตัวของคลาส A ตัวสร้างอาร์กิวเมนต์หนึ่งของคลาส B ตัวสร้างอาร์กิวเมนต์หนึ่งของคลาส B
  1. ภายใน Constructor thisและsuperจะต้องปรากฏเหนือนิพจน์อื่นๆ ทั้งหมดตั้งแต่เริ่มต้น มิฉะนั้นคอมไพลเลอร์จะส่งข้อความแสดงข้อผิดพลาด จากที่ตามมานั้นตัวสร้างตัวเดียวไม่สามารถมีทั้งสองอย่างthis()และsuper()

ความแตกต่างระหว่างซุปเปอร์กับสิ่งนี้

ตอนนี้เรารู้วิธีใช้คำหลักsuperและthisเข้าใจแล้วว่าคำหลักเหล่านั้นจำเป็นเพื่ออะไร แต่มีตัวเลือกอื่นสำหรับการใช้คำหลักเหล่านี้ที่ฉันไม่ได้พูดถึง - ในคลาส Inner ซึ่งสะดวกมากในการอ้างถึงคลาสภายนอกโดยใช้แบบฟอร์มสัญกรณ์ภายนอก thisสำหรับอินสแตนซ์ปัจจุบันและภายนอก super- สำหรับพ่อแม่ของเขา อย่าลืมแทนที่ Outer ด้วยชื่อของคลาสภายนอก ตอนนี้เรามาสรุปความแตกต่างที่สำคัญระหว่างคำหลักthisและsuper
  1. ตัวแปรthisอ้างอิงถึงอินสแตนซ์ปัจจุบันของคลาสที่ใช้งาน ในขณะที่มันsuperอ้างถึงอินสแตนซ์ปัจจุบันของคลาสพาเรนต์

  2. คอนสตรัคเตอร์แต่ละตัว ในกรณีที่ไม่มีการเรียกคอนสตรัคเตอร์อื่นอย่างชัดเจน จะเรียกคอนsuper()สตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์ของคลาสพาเรนต์โดยปริยาย แต่คุณมักจะมีตัวเลือกในการเรียกคอนสตรัคเตอร์อื่นอย่างชัดเจนด้วยthis()หรือsuper()
นี่อาจเป็นทั้งหมดที่สามารถพูดได้เกี่ยวกับความแตกต่างระหว่างคำหลักthisและsuperใน Java และวิธีการใช้ในโปรแกรม ดังที่เราได้เห็นไปแล้ว วัตถุประสงค์หลักของพวกเขาคือการเรียก Constructor ตัวหนึ่งจากอีกตัวหนึ่งและอ้างอิงถึงตัวแปรอินสแตนซ์ที่ประกาศในคลาสปัจจุบันและคลาสพาเรนต์ อย่าลืมว่าสิ่งเหล่านี้ไม่ใช่ตัวแปรธรรมดา และตอนนี้ - คำตอบสำหรับคำถามของฉันซึ่งฉันถามในย่อหน้าแรก ไม่ได้thisไม่สามารถกำหนดค่าตัวแปรใหม่ได้ เนื่องจากตัวแปรถูกประกาศเป็นค่าสุดท้าย คุณสามารถลองทำสิ่งนี้ได้ใน IDE - คุณจะได้รับข้อผิดพลาดในการคอมไพล์ "คุณไม่สามารถกำหนดค่าใหม่ให้กับตัวแปรได้this- มันถูกประกาศให้เป็นที่สิ้นสุด" บทความต้นฉบับที่นี่
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION