ความแตกต่างระหว่าง Class.this กับสิ่งนี้ใน Java คืออะไร


121

มีสองวิธีในการอ้างอิงอินสแตนซ์ของคลาสภายในคลาสนั้น ตัวอย่างเช่น:

class Person {
  String name;

  public void setName(String name) {
    this.name = name;
  }

  public void setName2(String name) {
    Person.this.name = name;
  }
}

หนึ่งใช้this.nameอ้างอิงฟิลด์อ็อบเจ็กต์ แต่อีกอันใช้className.thisอ้างอิงฟิลด์อ็อบเจ็กต์ การอ้างอิงทั้งสองนี้แตกต่างกันอย่างไร

คำตอบ:


165

ในกรณีนี้พวกเขาจะเหมือนกัน Class.thisไวยากรณ์จะเป็นประโยชน์เมื่อคุณมีไม่คงที่ชั้นซ้อนกันที่ความต้องการในการอ้างถึงเช่นชั้นนอกของมัน

class Person{
    String name;

    public void setName(String name){
        this.name = name;
    }

    class Displayer {
        String getPersonName() { 
            return Person.this.name; 
        }

    }
}

2
ถ้าแทน Person.this.name คุณแค่พูดว่า "return name" จะใช้ไม่ได้?
Amit G

7
@Amit G - ในตัวอย่างนี้ใช่มันจะได้ผล อย่างไรก็ตามมีหลายครั้งที่คุณต้องชี้แจงว่าคุณกำลังใช้ "this" ตัวใดอยู่ (เช่นหากมีความขัดแย้งในชื่อสมาชิกหรือชื่อวิธีการ) ดูคำตอบของ Michael สำหรับตัวอย่างที่เกี่ยวข้อง
jtahlborn

1
ตัวอย่างหนึ่งคือเมื่อคุณต้องอ้างอิงถึงPerson.thisวัตถุอื่น
Bowi

85

ไวยากรณ์นี้จะเกี่ยวข้องก็ต่อเมื่อคุณมีคลาสที่ซ้อนกัน:

class Outer{
    String data = "Out!";

    public class Inner{
        String data = "In!";

        public String getOuterData(){
            return Outer.this.data; // will return "Out!"
        }
    }
}

13

คุณต้องใช้ className เท่านั้นสำหรับคลาสภายใน หากคุณไม่ได้ใช้งานก็ไม่ต้องกังวลไป


4

Class.thisOuterClassเป็นประโยชน์ในการอ้างอิงไม่คงที่

ในการสร้างอินสแตนซ์ nonstatic InnerClassคุณต้องสร้างอินสแตนซ์ไฟล์OuterClass. ดังนั้น nonstatic InnerClassจะมีการอ้างอิงของมันเสมอOuterClassและฟิลด์และวิธีการทั้งหมดOuterClassจะพร้อมใช้งานสำหรับไฟล์InnerClass.

public static void main(String[] args) {

        OuterClass outer_instance = new OuterClass();
        OuterClass.InnerClass inner_instance1 = outer_instance.new InnerClass();
        OuterClass.InnerClass inner_instance2 = outer_instance.new InnerClass();
        ...
}

ในตัวอย่างนี้ทั้งสองInnerclassถูกสร้างอินสแตนซ์จากสิ่งเดียวกันOuterclassดังนั้นทั้งสองจึงมีการอ้างอิงเดียวกันกับไฟล์Outerclass.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.