Apa perbedaan antara Class.this dan ini di Java

121

Ada dua cara untuk mereferensikan instance kelas dalam kelas itu. Sebagai contoh:

class Person {
  String name;

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

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

Satu menggunakan this.nameuntuk mereferensikan bidang objek, tetapi yang lain menggunakan className.thisuntuk mereferensikan bidang objek. Apa perbedaan antara kedua referensi ini?

datauser
sumber

Jawaban:

165

Dalam hal ini, keduanya sama. The Class.thissintaks berguna bila Anda memiliki kelas bersarang non-statis bahwa kebutuhan untuk merujuk pada contoh kelas luarnya ini.

class Person{
    String name;

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

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

    }
}
StriplingWarrior
sumber
2
Jika bukannya Person.this.name Anda hanya mengatakan "nama kembali" apakah itu tidak akan berhasil?
Amit G
7
@Amit G - dalam contoh ini, ya, ini akan berhasil. namun, ada kalanya Anda perlu mengklarifikasi "ini" yang Anda gunakan (misalnya, jika ada konflik dalam nama var anggota atau nama metode). lihat jawaban Michael untuk contoh yang relevan.
jtahlborn
1
Salah satu contohnya adalah ketika Anda harus memberikan referensi ke Person.thisobjek lain.
Bowi
85

Sintaks ini hanya menjadi relevan jika Anda memiliki kelas bertingkat:

class Outer{
    String data = "Out!";

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

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

Anda hanya perlu menggunakan className.this untuk kelas dalam. Jika Anda tidak menggunakannya, jangan khawatir.

artbristol
sumber
4

Class.thisberguna untuk referensi yang tidak statis OuterClass.

Untuk membuat instance nonstatic InnerClass, Anda harus membuat instance OuterClass. Oleh karena itu, nonstatic InnerClassakan selalu memiliki referensi OuterClassdan semua bidang serta metode OuterClasstersedia untuk 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();
        ...
}

Dalam contoh ini keduanya Innerclassdibuat instance-nya dari yang sama Outerclasssehingga keduanya memiliki referensi yang sama ke Outerclass.

Spionase
sumber